题目
查看题目
(hard)
解题思路
labuladong的优先队列思路.
合并 k 个有序链表的逻辑类似合并两个有序链表,难点在于,如何快速得到 k 个节点中的最小节点,接到结果链表上?
这里我们就要用到 优先级队列(二叉堆) 这种数据结构,把链表节点放入一个最小堆,就可以每次获得 k 个节点中的最小节点:
代码
/**
* 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.length==0) return null;
ListNode dummy =new ListNode(-1);
ListNode p=dummy;
//优先队列最小堆
PriorityQueue<ListNode> pq = new PriorityQueue<>(
lists.length, (a, b)->(a.val - b.val));
//将k个链表的头节点加入最小堆
for(ListNode head:lists){
if(head!=null){
pq.add(head);
}
}
while(!pq.isEmpty()){
//获取最小节点,接到结果链表中去
ListNode node=pq.poll();
p.next=node;
if(node.next!=null){
pq.add(node.next);
}
//p指针不断前进
p=p.next;
}
return dummy.next;
}
}