leetcode-23.png
21题是两个链表
23题是k个链表
之前判断两个节点皆可,现在是k个节点
思路差不多,就是如何处理k个节点的问题
在这里用小顶堆(优先队列)来处理这个问题
首先将k个链表的头节点放入优先队列
然后在循环中遍历这k个节点
优先队列
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0) return null;
ListNode head = new ListNode(-1);
ListNode p = head;
PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length, (a, b)->(a.val - b.val));
for(ListNode h : lists){
if(h != null){
pq.add(h);
}
}
while(!pq.isEmpty()){
ListNode node = pq.poll();
p.next = node;
if(node.next != null){
pq.add(node.next);
}
p = p.next;
}
return head.next;
}
}
哪个链表的节点首先出队列,就先将这个链表接下来的节点放入队列