23- Merge-k-Sorted-Lists
0x0 题目详情
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
测试用例:
示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
0x1 解题思路
思路1: 一看这道题的关键字,有序、合并,是不是有点归并排序的味道?对咯。这道题就可以使用归并排序的思路。先合并两个链表,然后合并四个链表,依次类推,思路很简单,就是写代码的时候要注意细节。
思路2:
这道题难就难在是k个链表,如果是两个链表,那非常简单。这道题用if-else就没法写了。所以我们需要额外使用小根堆来辅助我们进行自动排序。,每次从小根堆取出堆顶元素,然后再加入下一个元素,直到堆为空,这样k个链表的合并就完成了。
0x2 代码实现
代码引用自sweetiee
``` java "思路1" class Solution { public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) { return null; } return merge(lists, 0, lists.length - 1); }
private ListNode merge(ListNode[] lists, int lo, int hi) {
if (lo == hi) {
return lists[lo];
}
int mid = lo + (hi - lo) / 2;
ListNode l1 = merge(lists, lo, mid);
ListNode l2 = merge(lists, mid + 1, hi);
return merge2Lists(l1, l2);
}}
小根堆的排序复杂度为Klog(K),平均每个在堆内的元素花费的复杂度为log(K),总共有N个元素,所以排序的复杂度为Nlogk。
0x3 课后总结
用小根堆没啥好说,主要这道题的有序、合并,这跟归并排序的思路太相似了,以后看到这两个词,就可以往归并上面靠。
Last updated
Was this helpful?