当前位置: 首页 > news >正文

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点

堆 优先队列

LeetCode23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]

提示:
k == lists.length
0 <= k <= 104
0 <= lists[i].length <= 500
-104 <= lists[i][j] <= 104
lists[i] 按 升序 排列
lists[i].length 的总和不超过 104

堆(优先队列)

n = ∑ l i s t s [ i ] . l e n g t h \sum lists[i].length lists[i].length
暴力做法:将数据全部放到大根堆,从链表尾部开始拼接。时间复杂度: O(nlogn)
进阶的做法:
由于链表是有序的,那新链表的新元素一定是旧链表没有处理的首元素。
用 小根堆,存储 lists首元素的值,和指针。
出栈:
栈顶元素,并加到新栈尾部。
如果栈顶元素的next非空,则将next加到堆中。
时间复杂度:O(nlogk)

代码

class Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<pair<int,ListNode*>, vector<pair<int, ListNode*>>, std::greater<>> heap;for (auto& p : lists) {if( nullptr == p){continue;}heap.emplace(make_pair(p->val, p));}ListNode* head = nullptr, *tail = nullptr;while (heap.size()) {auto [val, p] = heap.top();heap.pop();if (nullptr == head) {head = tail = new ListNode(val);}else {tail->next = new ListNode(val);tail = tail->next;}if (nullptr != p->next ) {p = p->next;heap.emplace(make_pair(p->val, p));}}return head;}
};

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

  • 有哪些在本地运行大模型的方法
  • 交换机需要多大 buffer(续:更一般的原理)
  • 百日筑基第十一天-看看SpringBoot
  • Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件
  • 深度学习基准模型Transformer
  • 开灯问题(数学思路)
  • 第二十条:与抽象类相比,优先选择接口
  • 程序员需要具备的核心竞争力
  • 【等保2.0是什么意思?等保2.0的基本要求有哪些? 】
  • 游戏中的坐标转换函数*2(laya2D)
  • JVM的五大内存区域
  • AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理
  • 【python】OpenCV—Nighttime Low Illumination Image Enhancement
  • 1.1.2数据结构的三要素
  • 将带有 商店idr 商品信息的json导入到mongodb后,能不能根据商店id把所有商品全部提取并转为电子表格
  • 时间复杂度分析经典问题——最大子序列和
  • android图片蒙层
  • Angular 2 DI - IoC DI - 1
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaScript类型识别
  • MySQL-事务管理(基础)
  • Redis中的lru算法实现
  • Spark学习笔记之相关记录
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue 个人积累(使用工具,组件)
  • Vue 2.3、2.4 知识点小结
  • vue的全局变量和全局拦截请求器
  • 从伪并行的 Python 多线程说起
  • 分类模型——Logistics Regression
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 如何选择开源的机器学习框架?
  • 算法-插入排序
  • 算法系列——算法入门之递归分而治之思想的实现
  • Hibernate主键生成策略及选择
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ### RabbitMQ五种工作模式:
  • #includecmath
  • #Z0458. 树的中心2
  • $.ajax()参数及用法
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)使用竞争神经网络实现数据聚类
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (接口封装)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)elasticsearch 源码之启动流程分析
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)c++ std::pair 与 std::make
  • (转)JAVA中的堆栈
  • (转)程序员技术练级攻略
  • (转)大道至简,职场上做人做事做管理