给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
题解
构建一个大小为k的小根堆,堆中初始存放每个链表的头结点
当堆不为空,每次从堆中poll出值最小的链表节点接到新链表上
当被poll出节点的下一个节点不为空,把被poll出的链表节点的下一个节点入堆
返回新链表头结点
/**
* 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) {
//构建小根堆,因为存储的是node节点,所以需要重写比较方法
Queue<ListNode> pq = new PriorityQueue<>((v1,v2)->v1.val-v2.val);
//将数组中每个链表的头结点放入堆中
for(ListNode node:lists){
if(node!=null){
pq.offer(node);
}
}
//新链表的头结点
ListNode dummyHead = new ListNode(0);
ListNode tail = dummyHead;
while(!pq.isEmpty()){
//获取当前的值最小的链表节点
ListNode minNode = pq.poll();
//将值最小的
tail.next = minNode;
tail=minNode;
//将被放入新链表的节点的下一个节点入堆
if(minNode.next!=null){
pq.offer(minNode.next);
}
}
return dummyHead.next;
}
}