给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 = [[]] 输出:[]
解题方法:(最小堆)
1.创建最小堆(优先队列),然后开始将列表中的链表全部加入到堆中,(a, b) -> a.val - b.val
是一个自定义比较器,用于比较两个 ListNode
的值,使得堆始终保持最小的节点在顶部。
2.然后创建哨兵节点,进入循环,循环条件:当 pq
不为空时,执行以下操作:
-
取出堆顶元素
node
(即当前所有节点中最小的)。 -
如果
node
有下一个节点node.next
,则将node.next
加入pq
,确保后续节点也能参与排序。 -
将
node
添加到新链表:
-
cur.next = node
:让当前指针cur
指向node
,即把node
加入新链表。 -
cur = cur.next
:移动cur
指针,以便继续添加下一个节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);
for (ListNode head : lists) {
if (head != null) {
pq.offer(head);
}
}
ListNode dummy = new ListNode();
ListNode cur = dummy;
while (!pq.isEmpty()) {
ListNode node = pq.poll();
if (node.next != null) {
pq.offer(node.next);
}
cur.next = node;
cur = cur.next;
}
return dummy.next;
}
}