23. 合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
AC代码
/**
* 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) {
// 判断边界
if(lists == null || lists.length <= 0){
return null;
};
// 初始化最小堆(优先级队列),升序排序
PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a,b) -> a.val - b.val);
// 将列表中所有头节点加入堆
for (ListNode head: lists) {
// 跳过空节点
if(head != null){
minHeap.offer(head);
};
};
// 创建新链表
ListNode dummy = new ListNode(0);
// 新链表当前节点
ListNode cur = dummy;
// 循环弹出堆顶点
while(!minHeap.isEmpty()){
// 堆中的当前节点,poll()获取的同时将此节点踢出
ListNode smallest = minHeap.poll();
cur.next = smallest; //合并链表
cur = cur.next; //移动节点
// 判断smallest是否还有下一个结点
if(smallest.next != null){
// 有就加入堆
minHeap.offer(smallest.next);
};
};
return dummy.next;
}
}