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

    }

}
原文地址:https://www.cnblogs.com/null00/p/5060690.html