[LeetCode]23. Merge k Sorted Lists
题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
测试案例
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
思路
使用最小堆进行多路归并,堆中存放的元素是每一个有序链表。
排序的比较方法是链表头节点的值。
每次从堆中取出最小值后,取出头结点。当链表剩余部分非空时,就将其放入堆中。将头结点放入结果队列的尾部。
具体实现
-
由于 java 中有数据结构 PriorityQueue(优先级队列),所以利用它来实现。创建优先级队列时,传入一个比较器即可。
-
然后依次将每个非空链表放入队列中。
-
接下来,只要队列非空,就从中取出最小值的链表。取出头结点,剩余部分非空时,放回队列,将头结点放入结果队列尾部。
-
优先级队列为空时,将结果队列尾节点的 next 置为空,注意,此时 tail 可能为空。需要先判断。
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode head = null, tail = null;
//建立一个优先级队列
PriorityQueue<ListNode> heap = new PriorityQueue<>((n1, n2)->{
return n1.val - n2.val;
});
int num = lists.length;
//依次放入每一个非空链表
for(int i = 0; i < num; i++){
if(lists[i] != null){
heap.offer(lists[i]);
}
}
ListNode cur;
while(!heap.isEmpty()){
cur = heap.poll();
if(cur.next != null){
heap.offer(cur.next);
}
if(head == null){
head = cur;
}
else{
tail.next = cur;
}
tail = cur;
}
if(tail != null){
tail.next = null;
}
return head;
}
}
标签:
LeetCode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥