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

合并K个升序链表(最优解)

题目来源

23. 合并 K 个升序链表 - 力扣(LeetCode)


题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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 <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

题目限制

用最优解做出来


思路分析

在解决给定多个按升序排列的链表,将它们合并为一个升序链表的问题时,一种常见思路是采用顺序合并。先实现一个能合并两个有序链表的函数,通过比较节点值大小依次连接节点来合并。在合并多个链表的主函数里,先处理边界情况,如链表数组为空或元素全为空链表时直接返回相应结果,若有有效链表,则先取第一个链表作为初始合并结果,随后从第二个链表起循环调用合并两链表的函数,不断更新合并结果,直至处理完所有链表,最终返回合并好的链表头节点,其时间复杂度为 O(kn)( k为链表个数, n为平均链表长度),空间复杂度为 O(1)。


具体代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* mergeTWOLists(ListNode* a,ListNode* b) {ListNode *xt=new ListNode(-1);ListNode *tail=xt;while(a&&b){if(a->val<b->val){tail->next=a;a=a->next;}else{tail->next=b;b=b->next;}tail=tail->next;}if(a)tail->next=a;else tail->next=b;return xt->next;}ListNode* mergeKLists(vector<ListNode*>& lists) {if(lists.empty())return nullptr;ListNode *res=lists[0];for(int i=1;i<lists.size();i++){if(lists[i])res=mergeTWOLists(res,lists[i]);}return res;}
};

这段代码中,Solution类里的mergeTwoLists函数用于合并两个有序链表,通过创建虚拟头节点,利用循环比较两链表当前节点值大小并按需连接,循环结束后处理剩余节点,最终返回合并后链表头节点;mergeKLists函数则是处理多个有序链表的合并,先判断链表数组是否为空,非空时取首个链表为初始结果,再循环调用mergeTwoLists函数依次合并剩余链表,最后返回合并好的完整有序链表的头节点,整体实现了将多个升序链表合并为一个升序链表的功能。

http://www.lryc.cn/news/507974.html

相关文章:

  • kubernates实战
  • How to run Flutter on an Embedded Device
  • airflow docker 安装
  • 浅析InnoDB引擎架构(已完结)
  • 华为云计算HCIE笔记02
  • 鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现
  • STM32低功耗模式结合看门狗
  • 数据迁移工具,用这8种!
  • Sapro编程软件
  • Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析...
  • 2024年图像处理、多媒体技术与机器学习
  • java 1.8+springboot文件上传+vue3+ts+antdv
  • 【机器人】机械臂轨迹和转矩控制对比
  • 如何利用矩阵化简平面上的二次型曲线
  • 【系统移植】制作SD卡启动——将uboot烧写到SD卡
  • sql server 数据库还原,和数据检查
  • 工业大数据分析算法实战-day12
  • Hive其一,简介、体系结构和内嵌模式、本地模式的安装
  • LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测
  • MacPorts 中安装高/低版本软件方式,以 RabbitMQ 为例
  • CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
  • 建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
  • 群晖利用acme.sh自动申请证书并且自动重载证书的问题解决
  • 质量小议51 - 茧房
  • 【C++图论】2359. 找到离给定两个节点最近的节点|1714
  • 重拾设计模式-外观模式和适配器模式的异同
  • 51c自动驾驶~合集42
  • 34 Opencv 自定义角点检测
  • 信创技术栈发展现状与展望:机遇与挑战并存
  • 跟我学c++中级篇——C++中的缓存利用