Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Show Tags
LeetCode: Merge k Sorted Lists 解题报告

参考资料: 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     }
View Code

相关文章:

  • 2021-11-16
  • 2021-10-16
  • 2022-02-21
  • 2021-10-30
  • 2021-12-26
  • 2021-12-15
猜你喜欢
  • 2021-07-29
  • 2022-01-15
  • 2021-07-29
  • 2021-08-27
  • 2021-06-21
  • 2022-01-24
  • 2021-09-20
相关资源
相似解决方案