zoukankan      html  css  js  c++  java
  • LeetCode

    题目:

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

    思路:

    1)直接利用Merge two sorted lists的代码,但超时了。原因是这个时间复杂度太大,2n + 3n + 4n +..+ kn = O(nk^2)

    package list;
    
    public class MergeKSortedLists {
    
        public ListNode mergeKLists(ListNode[] lists) {
            int len;
            if (lists == null || (len = lists.length) == 0) return null;
            ListNode q = lists[0];
            for (int i = 1; i < len; ++i) {
                q= mergeTwoLists(q, lists[i]);
            }
            
            return q;
        }
        
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        
            ListNode p = new ListNode(0);
            p.next = null;
            ListNode head = p;
            
            while (l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    p.next = l1;
                    l1 = l1.next;
                } else {
                    p.next = l2;
                    l2 = l2.next;
                }
                p = p.next;
            }
            
            p.next = l1 == null ? l2 : l1;
            return head.next;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
        }
    
    }

    2)运用merge sort的思想,两两合并。时间复杂度是2n*k/2 + 4n*k/4 + .. + (2^x)n*k/(2^x) = xkn,其中x为logk

    package list;
    
    public class MergeKSortedLists {
    
        public ListNode mergeKLists(ListNode[] lists) {
            int len;
            if (lists == null || (len = lists.length) == 0) return null;
            
            int cur = 0;
            int end = len - 1;
            while (end > 0) {
                cur = 0;
                while (cur < end) {
                    lists[cur] = mergeTwoLists(lists[cur], lists[end]);
                    ++cur;
                    --end;
                }
            }
                        
            return lists[0];
        }
        
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        
            ListNode p = new ListNode(0);
            p.next = null;
            ListNode head = p;
            
            while (l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    p.next = l1;
                    l1 = l1.next;
                } else {
                    p.next = l2;
                    l2 = l2.next;
                }
                p = p.next;
            }
            
            p.next = l1 == null ? l2 : l1;
            return head.next;
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
        }
    
    }
  • 相关阅读:
    RRC Server安装配置过程
    开园啦~
    VB.NET 初涉线程的定义和调用
    使用 VB.NET 开发多线程
    多线程 与 单线程 的区别
    Marshal 类的内存操作的一般功能
    VB.NET 内存指针和非托管内存的应用
    OpenProcess() 函数
    DataTable与结构不同实体类之间的转换
    C#的同步和异步调用方法
  • 原文地址:https://www.cnblogs.com/null00/p/5060690.html
Copyright © 2011-2022 走看看