难度:Hard
题目:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = [] 输出:[]
示例 3:
输入:lists = [[]] 输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
Related Topics
- 链表
- 分治
- 堆(优先队列)
- 归并排序
重点!!!解题思路
第一步:
明确解题手段:一般像这种归并排序的多路归一路的话可以使用堆来解决
第二步:
小顶堆解法
把每个头节点添加到堆中去,当堆poll这个节点时,看看这个几点还有没有next了,如果有就扔堆里,没有就不继续操作了 ,这样每次把poll的节点连在一起即可返回结果了
源码:
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length==0) return null;
PriorityQueue<ListNode> q=new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val- o2.val;
}
});
for (ListNode listNode:lists) if (listNode!=null) q.add(listNode);
ListNode ret=new ListNode(-1),p=ret;
while (!q.isEmpty()){
ListNode cur = q.poll();
p.next=cur;
p=cur;
if (cur.next!=null) q.add(cur.next);
}
return ret.next;
}
}
运行结果:
系列持续更新中,喜欢练习算法的那就点个攒吧