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
    
        }
    
    }
  • 相关阅读:
    Java在ACM中的应用
    acm->stl
    残缺棋盘--状压DP
    EOJ Monthly 2019.3 A
    【CF1141E】Superhero Battle
    AtCoder Grant Contest 10.F 博弈
    莫比乌斯反演总结
    P2257 YY的GCD
    BZOJ1011 莫比乌斯反演(基础题
    HDU1695 莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/null00/p/5060690.html
Copyright © 2011-2022 走看看