题目来源:https://leetcode-cn.com/problems/merge-k-sorted-lists/
大致题意:
给 K 个升序链表,合并成一个升序链表
思路
- 存下所有链表当前遍历的节点
- 每次比较所有链表当前遍历的节点值,将最小的节点入新链表,并将对应的链表指针后移
问题:
- 如何对比出最小节点
如果每次添加一个节点入新链表后,对于新节点都重新比较一边,显然比较费时
- 可以通过优先队列存当前所有链表当前遍历的节点,队首元素即为最小值所在节点
- 每次将队首元素出队,并且判断对应链表是否为空,若不为空将后续节点继续入队
- 重复第二步,直至队列为空
public ListNode mergeKLists(ListNode[] lists) {
// 使用优先队列,并初始化排序规则
PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> a.val - b.val);
int n = lists.length;
// 初始化,将所有链表头节点放入队列
for (int i = 0; i < n; i++) {
if (lists[i] != null) {
queue.offer(lists[i]);
}
}
// 合并后的链表
ListNode ans = new ListNode(0);
ListNode head = ans; // 保存头节点
while (!queue.isEmpty()) {
// 取出最小节点
ListNode node = queue.poll();
// 放入合并后的链表
ans.next = node;
ans = ans.next;
// 若链表不为空,放入后续节点
if (ans.next != null) {
queue.offer(ans.next);
}
}
return head.next;
}