### 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    }}`