LeetCode 23 合并K个升序链表

LeetCode 23 合并K个升序链表


题目:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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

题解:
此题我们使用小顶堆数据结构巧解此事:

解题步骤如下:
1.创建K个指针依次指向K个链表的表头
2.定义小顶堆,比较对象是K指针指向的节点的值
3.将K个指针放入小顶堆
4.定义哨兵节点Head
5.取小顶堆顶部节点H,此节点为当前堆中最小值,将此节点链接到哨兵节点之后,
  然后将此指针后移(如果有),然后重新放入小顶堆中重拍
6.重复步骤5直至堆中节点全部推出

代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private ListNode process(ListNode[] lists){
ListNode head = new ListNode(0);
ListNode p = head;
if (lists.length == 0) return null;
PriorityQueue<ListNode> priorityQueue = new PriorityQueue<>(lists.length, Comparator.comparingInt(o -> o.val));
for (ListNode node : lists) {
if (node != null) {
priorityQueue.offer(node);
}
}
while (!priorityQueue.isEmpty()) {
ListNode node = priorityQueue.poll();
ListNode next = priorityQueue.peek();
if (next == null) {
p.next = node;
break;
}
ListNode pNode = node;
while (pNode.next != null && pNode.next.val <= next.val) {
pNode = pNode.next;
}
if (pNode.next != null) {
priorityQueue.add(pNode.next);
}
pNode.next = null;
p.next = node;
p = pNode;
}
return head.next;
}