一、问题
力扣问题链接:合并K个升序链表
二、解题思路
合并 k 个有序链表的逻辑类似合并两个有序链表,难点在于,如何快速得到 k 个节点中的最小节点,接到结果链表上?
这里我们就要用到 优先级队列 这种数据结构,把链表节点放入一个最小堆,就可以每次获得 k 个节点中的最小节点。
合并两个有序链表链接:合并两个有序链表
二、解题代码
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
ListNode dummy = new ListNode(-1);
ListNode p = dummy;
// 创建优先级队列,让放入的最小的节点最先拿出来
PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length, (a, b) -> (a.val - b.val));
//将所有链表的头结点放入最小堆
for (ListNode head : lists) {
if (head != null) {
pq.add(head);
}
}
while (!pq.isEmpty()) {
//从优先级队列中获取当前最小的节点
ListNode minNode = pq.poll();
//将当前最小的节点接到结果链表中
p.next = minNode;
//最小节点之后还有数据,则继续放入优先级队列
if (minNode.next != null) {
pq.add(minNode.next);
}
// p指针不断前进
p = p.next;
}
return dummy.next;
}