LeetCode hot 100—合并K个排序链表

【TM1640】STM32 TM1640芯片驱动程序 以下为.h文件: #ifndef __TM1640_H__ #define __TM1640_H__ #include "stm32f10x.h" #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制显示 ... 阅读详情

题目

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

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

示例

示例 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 = [[]]
输出:[]

分析

为了将多个已排序的链表合并成一个升序链表,可以使用分治法。分治法的核心思想是将问题分解为更小的子问题,然后逐个解决子问题,最后将子问题的解合并起来得到原问题的解。

分治法

代码解释

mergeTwoLists 函数:

  • 该函数用于合并两个有序链表。
  • 创建一个虚拟头结点 dummy,并使用 tail 指针来构建结果链表。
  • 比较两个链表的节点值,将较小的节点添加到结果链表中。
  • 最后将剩余的节点添加到结果链表的末尾。

mergeLists 函数:

  • 该函数使用分治法来合并多个链表。
  • 如果 left 大于 right,返回 nullptr。
  • 如果 left 等于 right,返回 lists[left]。
  • 计算中间位置 mid,递归地合并左半部分和右半部分的链表。
  • 最后调用 mergeTwoLists 函数将合并后的两个链表合并成一个链表。

mergeKLists 函数:

  • 该函数调用 mergeLists 函数,从整个链表数组的范围开始合并。

时间复杂度:O(N\log k), N 是所有链表中的节点总数,k 是链表的数量

空间复杂度:O(\log k)

class Solution {
private:
    // 合并两个有序链表的函数
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 创建一个虚拟头结点,方便处理
        ListNode dummy(0);
        ListNode* tail = &dummy;
        // 比较两个链表的节点值,将较小的节点添加到结果链表中
        while (l1 && l2) {
            if (l1->val < l2->val) {
                tail->next = l1;
                l1 = l1->next;
            } else {
                tail->next = l2;
                l2 = l2->next;
            }
            tail = tail->next;
        }
        // 将剩余的节点添加到结果链表中
        if (l1) {
            tail->next = l1;
        } else {
            tail->next = l2;
        }
        return dummy.next;
    }
    // 分治法合并多个链表的函数
    ListNode* mergeLists(vector<ListNode*>& lists, int left, int right) {
        if (left > right) {
            return nullptr;
        }
        if (left == right) {
            return lists[left];
        }
        int mid = left + (right - left) / 2;
        // 递归合并左半部分和右半部分的链表
        ListNode* l1 = mergeLists(lists, left, mid);
        ListNode* l2 = mergeLists(lists, mid + 1, right);
        return mergeTwoLists(l1, l2);
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return mergeLists(lists, 0, lists.size() - 1);
    }
};    
[金仓数据库V8R6]更换授权 上传授权,使用mv license_xxx_0.dat /home/kingbase/KingbaseES/license.dat替换每个授权,并使用ls -l license.dat确保替换前后属主和权限不变。根据步骤1的数据目录位置,执行/home/kingbase/KingbaseES/Server/bin/sys_ctl -D /home/kingbase/KingbaseES/data reload使新的授权文件生效。该参数意义为授权剩余有效天数,查询结果为新授权中有效期间的天数即为替换成功。 阅读详情

相关推荐

ICC II 时钟树综合(CTS)前奏:从约束定义到NDR规则的全方位设置指南

本文详细介绍了ICC II中时钟树综合(CTS)的前期准备工作,包括约束定义、NDR规则设置和时钟平衡点控制等关键步骤。通过实际案例和代码示例,指导工程师如何优化时钟偏斜、插入延迟和信号质量,确保芯片设计的时序收敛和性能稳定。特别强调了非默认布线规则(NDR)在时钟网络设计中的重要性。

weixin_42530458的博客 212

链表5:6种方法实现合并K个有序链表

一法解多题是为了看透本质,一题多解是为了融会贯通。 前一篇,我们从一法解多题的思路搞定了leetcode 的21、23和1669题。今天我们来看看一题多解的情况。 LeetCode23:合并K个升序链表:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 这道题有多少种解法呢? 策略一:K 个指针分别指向 K 条链表 方法1:直接合并 1.每次O(N)比较K个指针求最小的那个,时间复杂度为O(NK) class Solution { pu

纵横千里 捭阖四方 的专栏 2904

Titans:谷歌新型神经记忆架构,突破 Transformer 长序列处理的瓶颈

Titans 是谷歌推出的新型神经网络架构,通过神经长期记忆模块突破 Transformer 在处理长序列数据时的瓶颈,支持并行计算,显著提升训练效率。

士多啤梨先生の博客 991

链表之合并k个有序链表

在拆分的时候需要注意,我们用二分法将当前的数组中链表个数分为两部分,其中一部分是从【left->mid】,另一部分是从【mid+1->right 】这样才能将完整的数组拆成两个部分,而不会导致缺失。的思想,即将一个问题拆分成多个小问题,从小问题入手,最后再将一个个的小问题串起来,就解决掉大问题了。数组中存放了多个链表,因此先将数组拆分为多个两两一组的,这样就化简为。的问题,再两两重组之后,最后合成一个大链表,该链表即为最终有序链表。合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

qq_37115648的博客 839

软件缺陷(定义+表现形式+优先级+信息+产生原因),看完这篇文章就懂了

软件缺陷软件缺陷的定义软件缺陷的表现形式软件缺陷产生的原因软件缺陷的根源软件缺陷的费用软件缺陷的信息 软件缺陷的定义 IEEE 1983 of IEEE Stardard 729中软件缺陷做了一个标准的定义: 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。 因此软件缺陷就是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求。 缺陷不是bug,缺陷包含bug,缺陷的范围更大。 软件缺陷

qq_40676418的博客 1万+

ndnSIM学习笔记(一)

在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python &gt;= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib...

gaonjzzz的博客 2985

LeetCode 23 ——合并 K 个排序链表

1. 题目 2. 解答 2.1. 方法一 在 合并两个有序链表 的基础上,我们很容易想到第一种解法,首先我们将第一个链表和第二个链表合并成一个新的链表,然后再往后依次合并接下来的每个链表即可。 假设每个链表结点数一样都为 n,第一次合并时,要遍历 2n 个结点,往后则要分别遍历 3n, 4n, ... , kn 个结点。可以看到,每次...

weixin_34038652的博客 379

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3021

23.合并K个有序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

weixin_41368411的博客 1015

在Ubuntu 22.04 LTS上搞定Intel Quartus Prime 22.1和QuestaSim:一份保姆级的安装与License配置指南

本文提供在Ubuntu 22.04 LTS上安装和配置Intel Quartus Prime 22.1与QuestaSim的详细指南。涵盖依赖安装、环境变量设置、License配置及常见问题解决,帮助FPGA开发者快速搭建稳定的开发环境。特别针对Ubuntu系统优化,确保工具链高效运行。

weixin_29208077的博客 318

1. BES2700ZP概述

恒玄BES2700采用RTX5操作系统,配合mindmics算法或者自研算法。

雪飞_海 4467

合并K个有序链表

合并K个有序链表

shigen的博客 734

【ArcGIS微课1000例】0118:一文讲清楚tif(geotiff)栅格数据格式

TIFF(Tagged Image File Format)是一种常见的图像文件格式,它被广泛用于存储和传输各种类型的图像数据。图像存储:TIFF格式可以存储多通道的位图图像,包括灰度图、彩色图和透明度图等。它支持不同的像素深度,可以是8位、16位、24位或32位等。因此,TIFF格式非常适合存储高质量的图像数据,包括照片、卫星图像、医学影像等。无损压缩:TIFF格式支持无损压缩,这意味着图像可以被压缩而无需损失任何像素信息。这种压缩方式可以减小文件大小,而不会降低图像的质量。

智慧空间实验室 2819

力扣Hot100系列10(Java)——[链表]总结(下)(随机链表的复制,排序链表,合并k个升序链表,LRU缓存)

本文总结了力扣Hot100中关于链表的四道题目解法。首先介绍随机链表的深拷贝问题,通过哈希表缓存原节点与拷贝节点的映射关系,结合递归实现高效复制。其次讲解排序链表的归并排序解法,使用快慢指针找到中点后递归拆分合并。文章通过具体示例和代码注释详细解析了关键步骤,帮助理解哈希表去重、递归处理以及链表拆分合并等核心思想。这些解法均采用O(n)时间复杂度,兼顾效率与代码简洁性。

2402_89049045的博客 977

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【力扣hot100】23 合并K个排序链表(c++)解析

假设链表a和b的长度都是 n,如何在 O(n)的时间代价以及 O(1)的空间代价完成合并?这个问题在面试中常常出现,为了达到空间代价是 O(1),我们的宗旨是「原地调整链表元素的next 指针完成合并」。,你可以把 head 设置为一个虚拟的头(也就是head 的),这是为了方便代码的书写,。我们需要。注意这里的描述,tail不是下一个插入的位置,aPtr和 bPtr所指向的元素处于「待合并」的状态,也就是说它们还没有合并入最终的链表。当然你也可以给他们赋予其他的定义,但是定义不同实现就会不同。

zhangyuanbonj的博客 1023

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【力扣hot100题】(132)合并K个排序链表

设置一个结果链表result,依次合并每一个LinkNode即可。我真心觉得这题才是中等,上题才是困难……

s478527548的博客 119

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode 10-23. 合并K个排序链表

持续刷题第10天 ! 今天我们继续刷Leetcode 热题 HOT 100,日复一日,相信自己,一定会有进步。如果一个人刷题太孤独了,欢迎加群每日一题算法群,让我们大家一...

Jerry的编程之路 202

Leetcode HOT100精讲 —— (归并)148. 排序链表+23. 合并K个升序链表

归并思想 蓝色部分实际上是合并后向上返回的过程。 使用归并排序,分治,解决,合并。 分治,每次找到中间节点,将一个链表分解成两个链表,逐渐分分分,直到分到最小单元为每个节点 合并:DFS后序遍历,会自底向上,然后从最下层俩俩合并,然后四个四个合并,一直到合并成一个完整链表 148. 排序链表 时间复杂度O(nlogn):因为链表二分分治,logn , 每两个链表合并要O(n) class Solution { public: //使用归并排序,分治,合并。 //分治,每次找到中间节点,将一个链表分解成两个

Charles Ren's Tech Blog 744

【LeetCode Hot100 链表(下)】 删除链表中的倒数第 N 个节点、两两交换链表中的节点、K个一组反转链表、随机链表的复制、排序链表、合并 K 个升序链表、LRU 缓存

LRU 缓存的核心思想是,当缓存达到最大容量时,移除最久未使用的元素(即链表尾部的元素),并将最近使用的元素移到链表头部。给定一个链表,将链表中的每k个节点一组进行反转,并返回反转后的链表。合并所有链表,并返回合并后的升序链表。给定一个链表,交换每两个相邻的节点,并返回链表的头节点。在这个实现中,我们使用了一个双向链表和一个哈希表(给定一个链表,要求你返回排序后的链表。给定一个链表,删除链表的倒数第。指针,指向链表中的某个节点或。个节点,并返回链表的头节点。给定一个链表,每个节点除了有。

Luo_LA的博客 1111

leetcode hot100:七、解题思路大全:链表(K个一组翻转链表、随机链表的复制、排序链表、合并 K 个升序链表、LRU缓存)、栈(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大矩形)

记它一辈子呜呜呜呜呜呜呜。坏题!坏题!!!给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

shanshan的博客 743

力扣hot100第四天

新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。新链表是通过拼接给定的两个链表的所有节点组成的。给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

weixin_52297290的博客 890

最详细,最简单的力扣(leetcode)hot 100 链表(下)讲解

这期带来的是力扣hot 100的链表章节的下半部分。难度相较于上半部分会高一点。不过保证看了的都能看懂。

yyyCode的博客 1254

力扣HOT100之链表:23. 合并 K 个升序链表

但是这么做的耗时有点太长了,AC之后去看了下灵神的题解,感觉他的第一种思路特别通俗易懂,主要是借用了数据结构本身的特性,利用优先队列进行自动排序,而无需手动排序,因此我们只需要不断地将节点加入到优先队列中即可,这道题需要我们自定义一个排序规则,以对链表节点进行排序,当我们把优先队列的队头元素(队列内的最小值)取出后,我们需要判断队头元素的下一个节点是否为空,若不为空才将下一个节点加入到优先队列中。当所有链表的所有节点都被加入到优先队列中后,我们直接退出循环。循环中,如果遇到了还没遍历到末尾的链表,则。

weixin_52151595的博客 297

【leetcode hot 100 23】合并K个有序链表

【代码】【leetcode hot 100 23】合并K个有序链表。

longii11的博客 393

hot100【acm版】【2026.7.17打卡-java版本】

碎碎念:后续会更新每天学习的八股和算法 题,开始准备秋招的第68天。努力连续更新100天!以后每天就按,秋招项目【java +agent】,科研,必做项目,算法,八股,锻炼身体来总结。1.hot100 【acm】 33/100 ,2到3h,快速把hot100过一遍【5/20】2.秋招项目,【java 项目】,总结:继续过一遍面对面试的角度。确定方向就搞就可以了。【agent 项目 】,继续。

m0_56136663的博客 251

leetcode hot100 链表(二)

哈希映射法建立新链表结点与原节点的映射关系。利用小根堆实现,小根堆里维护每个非空链表。和上题使用了相同的命名体系。类似归并排序方法,先。

weixin_74129837的博客 703
上一篇: LeetCode hot 100—寻找旋转排序数组中的最小值
下一篇: LeetCode hot 100—分割等和子集
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值