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
    
        }
    
    }
  • 相关阅读:
    智算之道复赛
    试题 历届试题 幸运数(模拟)
    使用memcpy函数时要注意拷贝数据的长度
    试题 历届试题 大臣的旅费(求树的直径,两次dfs)
    试题 历届试题 连号区间数(规律)
    试题 历届试题 错误票据(输入处理,桶排序)
    试题 历届试题 剪格子(dfs)
    Rope大法(可持久化平衡树)
    常用数论知识总结(持续更新)
    计蒜客 035 三角形内点的个数(皮克定理)
  • 原文地址:https://www.cnblogs.com/null00/p/5060690.html
Copyright © 2011-2022 走看看