文章目录
- 题目链接
- 题目描述
- 思路
- 代码
题目链接
23.合并k个升序链表
题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表
思路
我在这个题里面用到了PriorityQueue(优先队列) 的知识
PriorityQueue 和队列 Queue 的区别在于 ,它的出队顺序与元素的优先级有关
对 PriorityQueue 调用 remove() 或 poll() 方法 ,返回的总是优先级最高的元素
先让整个链表遍历,然后让PriorityQueue 返回最小值
定义一个哨兵节点dummy和合并之后的尾节点pre
开始遍历优先队列,每次取出的值与尾节点连接,然后依次循环 就得出答案了
代码
public ListNode mergeKLists(ListNode[] lists) {
ListNode dummy = new ListNode(-1);
ListNode pre = dummy;
//PriorityQueue 默认是一个【小顶堆】,可以通过传入自定义的 Comparator 函数来实现【大顶堆】
Queue<ListNode> pq = new PriorityQueue<>((a,b) ->a.val-b.val);
for(ListNode node : lists){
if(node!=null){
pq.offer(node);
}
}
while(!pq.isEmpty()){
ListNode index = pq.poll();
pre.next = index;
pre = index;
if(index.next != null){
pq.offer(index.next);
}
}
return dummy.next;
}