Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Show Tags
参考资料: http://blog.csdn.net/linhuanmars/article/details/19899259。
SOLUTION 1:
使用分治法。左右分别递归调用Merge K sorted List,然后再使用merge linked list 合并在一起。
解答摘录如下:这 道题目在分布式系统中非常常见,来自不同client的sorted list要在central server上面merge起来。这个题目一般有两种做法,下面一一介绍并且分析复杂度。 第一种做法比较容易想到,就是有点类似于MergeSort的思路,就是分治法,不了解MergeSort的朋友,请参见归并排序-维基百科,是一个比较经典的O(nlogn)的排序算法,还是比较重要的。思路是先分成两个子任务,然后递归求子任务,最后回溯回来。这个题目也是这样,先把k个list分成两半,然后继续划分,知道剩下两个list就合并起来,合并时会用到Merge Two Sorted Lists这道题,不熟悉的朋友可以复习一下。代码如下:
1 /* 2 SOL 1: 3 使用merge sort和分治法完成 4 */ 5 public ListNode mergeKLists1(List<ListNode> lists) { 6 // 记得加上这个合法性判断。 7 if (lists == null || lists.size() == 0) { 8 return null; 9 } 10 11 return helper(lists, 0, lists.size() - 1); 12 } 13 14 /* 15 l, r表示list的左右边界 16 */ 17 public ListNode helper(List<ListNode> lists, int l, int r) { 18 if (l < r) { 19 int mid = l + (r - l) / 2; 20 21 /* 22 分治法。把问题分为2个更小的子问题:左边list的merge,和右边list的merge. 23 再把2个生成的解合并在一起。 24 */ 25 return merge(helper(lists, l, mid), helper(lists, mid + 1, r)); 26 } 27 28 return lists.get(l); 29 } 30 31 public ListNode merge(ListNode n1, ListNode n2) { 32 ListNode dummy = new ListNode(0); 33 ListNode cur = dummy; 34 35 while (n1 != null && n2 != null) { 36 if (n1.val < n2.val) { 37 cur.next = n1; 38 n1 = n1.next; 39 } else { 40 cur.next = n2; 41 n2 = n2.next; 42 } 43 44 cur = cur.next; 45 } 46 47 if (n1 != null) { 48 cur.next = n1; 49 } else { 50 cur.next = n2; 51 } 52 53 return dummy.next; 54 }