23. 合并 K 个升序链表 - 力扣(LeetCode)
小根堆:
java
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
//小根堆
PriorityQueue<ListNode> heap = new PriorityQueue<>(
(a,b) -> Integer.compare(a.val, b.val)
);
//答案
ListNode dummy = new ListNode();
ListNode cur = dummy;
//把每个头节点加入堆
for(ListNode node:lists){
if(node != null){
heap.offer(node);
}
}
//把堆里最小的加入链表
while(!heap.isEmpty()){
ListNode mini = heap.poll();
cur.next = mini;
cur = cur.next;
if(mini.next != null){
heap.offer(mini.next);
}
}
return dummy.next;
}
}
N是节点总数,K是堆大小
时间复杂度:Nlog(K)
空间复杂度:O(K)