Leetcode算法——21、合并两个有序链表

【中等】力扣算法题解析LeetCode21:合并两个有序链表 合并两个升序链表为一个新的升序链表。通过迭代法和双指针遍历,比较节点值并链接较小值节点,复用原链表节点以优化空间(O(1))。使用哑节点简化边界处理,最后拼接剩余链表。Java实现中,dummy节点指向新链表头,循环结束后直接返回dummy.next。代码简洁高效,执行时间0ms,内存消耗41.3MB。 关键词:升序链表合并、哑节点、双指针、空间优化、O(1)复杂度 阅读详情

题目

合并两个有序链表,返回一个新链表。即合并排序。

示例:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

思路

定义两个指针,分别指向两个链表的head。定义一个空的新链表。

然后依次取出指针值,比较大小,将较小值追加到新链表,同时将较小值所在链表的指针往后移动一位。

如果其中一个指针到头了,那么将另一个指针剩下的链表直接追加到新链表即可。

直至两个指针都指到了最后一位。

这时候,新链表即为合并后的链表。

python实现

class ListNode:
    def __init__(self, x):
        
        if isinstance(x, list):
            self.val = x[0]
            self.next = None
            head = self
            for i in range(1, len(x)):
                head.next = ListNode(x[i])
                head = head.next
        else:
            self.val = x
            self.next = None
        
    def output(self):
        '''
        输出链表
        '''
        result = str(self.val)
        head = self.next
        while(head is not None):
            result += f' -> {head.val}'
            head = head.next
        return '(' + result + ')'

def mergeTwoLists(l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    归并排序。
    """
    
    if not l1:
        return l2
    if not l2:
        return l1
    
    p1 = l1
    p2 = l2
    head = ListNode(0)
    p = head
    while(p1 and p2):
        if p1.val < p2.val:
            p.next = ListNode(p1.val)
            p1 = p1.next
        else:
            p.next = ListNode(p2.val)
            p2 = p2.next
        p = p.next
    if p1:
        p.next = p1
    elif p2:
        p.next = p2
    return head.next

if '__main__' == __name__:
    l1 = ListNode([1,2,3])
    l2 = ListNode([1,3,4])
    print(mergeTwoLists(l1,l2).output())
python【力扣LeetCode算法题库】21- 合并两个有序链表 合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 # Definition for singly-linked list. # class ListNode: # def __ini... 阅读详情

相关推荐

【忍者算法】从拉链到链表:探索有序链表的合并之道|LeetCode 21 合并两个有序链表

想象你正在整理两叠按日期排好序的收据。最自然的方式就是:拿起两叠收据,每次比较最上面的日期,选择日期较早的那张放入新的一叠中。这个简单的日常操作,恰恰就是我们今天要讨论的有序链表合并问题的真实写照。

忍者算法的博客 638

算法题:合并两个有序的链表

题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) 这个算法很像我们排序算法中的归并排序,只能说“很像”,因为思想是一样的,但是这个与归并排序还是有区别的,区别如下: 1.归并排序是针对有序数组,而这里是有序链表; 2.归并排序排序的时间复杂度为o(nlogn),而这里的时间复杂度最坏情况下为O(m+n),最好的情况下为

JXH_123的专栏 2万+

MeshLab新手必看:5分钟搞定泊松表面重建(附完整点云处理流程)

本文详细介绍了如何使用MeshLab进行泊松表面重建,从点云数据导入、预处理到核心参数设置,再到后处理与模型优化,提供了完整的3D重建流程指南。特别适合计算机视觉和3D重建领域的新手快速掌握泊松重建技术,提升工作效率。

kafka6courier的博客 230

LeetCode面试算法-力扣 21. 合并两个有序链表

题目描述 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null &&amp...

牧野飞鸿的博客 198

密码学:一文读懂数字证书

消息摘要算法用于验证数据完整性服务,对称加密算法和非对称加密算法用于保证数据保密性服务,数字签名算法用于抗否认性服务。数字证书集合了多种密码学算法:自身带有公钥信息,可完成相应的加密/解密操作;同时,还带有数字签名,可鉴别消息来源;且自身带有消息摘要信息,可验证证书的完整性;由于证书本身含有用户身份信息,因而具有认证性。

Shujie 2910

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 785

数据结构与算法|链表基础之力扣leetcode21合并两个有序链表(cpp、Java实现)

对于将两个升序链表合并的问题,以下是三种常见的解决方法:方法一:迭代法初始化一个新的链表,并设立一个指针指向新链表的头部。比较两个链表当前节点的值,将较小的节点添加到新链表中,并将指针移到下一个位置。重复步骤2,直到其中一个链表遍历完。将剩下的链表连接到新链表的后面。返回新链表的头部。方法二:递归法判断两个链表是否有一个为空,如果有,则返回另一个链表。比较两个链表当前节点的值,将较小的节点作为新链表的头节点。

染落林间色的博客 462

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8214

Leetcode算法题【简单】21.合并两个有序链表

具体步骤请查看每个关键步骤的代码注释。

qq_40800519的博客 307

Android CCodec (四) Output Buffer流程分析

Android 多媒体架构 Codec2 Output Buffer

给大佬递杯卡布奇诺的博客 3264

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4730

【力扣算法】21-合并两个有序链表

题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 题解 无官方题解 执行用时 : 2 ms, 在Merge Two Sorted Lists的Java提交中击败了98.56% 的用户 内存消耗 : 35.8...

ZeromaXHe的博客 327

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2566

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。新链表是通过拼接给定的两个链表的所有节点组成的。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。你可以假设除了数字 0 之外,这两个数字都不会以零开头。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。反转链表,让数字高位变成低位,然后低位开始相加。的方式存储的,并且每个节点只能存储。将两个升序链表合并为一个新的。看注释,题目也比较简单。

2301_80912559的博客 1045

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

合并两个有序链表 C++算法 leetcode21

题目:合并两个有序链表  将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例: 输入:1-&gt;2-&gt;4, 1-&gt;3-&gt;4 输出:1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4 解答: ①具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中; ②由于两个输入链表的长度可能不...

大壮159的博客 434

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

leetcode力扣21题合并两个有序链表

【代码】leetcode力扣21题合并两个有序链表。

xiaohao0001abc的博客 170

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...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LeetCode 21. 合并两个有序链表

写在前面: 我的写法很无脑,创建一个新的链表,然后把两个有序链表串起来,看了有的大佬写法是递归,这个没想到。 欢迎访问我的 力扣github仓库,有JavaScript和C++两个版本,每日更新 C++代码: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode ...

Gary的博客 163

Leetcode算法Java全解答--21. 合并两个有序链表

Leetcode算法Java全解答–21. 合并两个有序链表 文章目录Leetcode算法Java全解答--21. 合并两个有序链表题目想法结果总结代码我的答案大佬们的答案测试用例其他 题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1-&gt;2-&gt;4, 1-&gt;3-&gt;4 输出:1-&gt;1-&gt;2-&gt;...

cmqwan的博客 7603

[Java·算法·中等] LeetCode21. 合并两个有序链表

这个dummy节点的作用是为了简化算法的实现,它的下一个节点将指向合并后的链表的头结点。如果l1的值小于l2的值,则将current的下一个节点指向l1,并将l1指针向后移动一位;在一个while循环中,不断比较两个链表当前节点的值,选取其中较小的节点添加到合并后的链表中。创建一个名为current的指针,初始化为dummy节点,用于迭代合并后的链表。最后,如果其中一个链表还有剩余的节点,则直接将剩余链表接在合并后链表的末尾。返回dummy节点的下一个节点,即合并后链表的头结点。

double222222的博客 1639

【LeetCode】【算法】21. 合并两个有序链表

LeetCode 21. 合并两个有序链表

passer__jw767的博客 578

LeetCode经典算法面试题 #21:合并两个有序链表(迭代法、原地合并法等多种实现方案详解)

本文介绍了合并两个有序链表的多种解法,包括迭代法(哑节点法)、递归法、原地合并法和优先队列法。迭代法通过比较节点值逐步构建新链表,空间效率高;递归法代码简洁但可能栈溢出;原地合并法直接修改指针实现最优空间复杂度;优先队列法将所有节点排序但效率较低。核心思路都是利用链表的有序性,通过比较和指针操作完成合并。推荐使用迭代哑节点法,兼顾效率和代码清晰度。时间复杂度均为O(m+n),空间复杂度从O(1)到O(m+n)不等。

夏日清风 704

LeetCode 算法题库【21】——合并两个有序链表

合并两个有序链表 题目描述: 解题思路: 第一种:每次选两个链表头结点最小的,时间复杂度O(m+n) # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solut...

Jupiker的博客 464

算法练习|Leetcode189轮转数组 ,Leetcode56合并区间,Leetcode21合并两个有序链表,Leetcode2两数相加,sql总结

春招加油!

WR_mmc的博客 2085

【数据结构与算法】21.合并两个有序链表(LeetCode)

本文介绍了合并两个有序链表的高效算法及实现。通过双指针尾插法,比较节点值后按升序连接,时间复杂度为O(n+m)。文章详细解析了C语言实现中的关键点,包括边界处理、头节点初始化和剩余节点连接,并指出了常见错误(如赋值与比较混淆)。优化方案建议使用哨兵节点简化逻辑。该算法在归并排序、数据库系统等领域有广泛应用,是链表操作的重要基础算法。

凤年徐的博客 1774

leetcode算法题21——合并两个有序链表

合并两个有序链表(简单) 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 解题 这个题很简单,定义两个指针分别指向两个链表,然后比较这两个值,把小的插入到新链表中,然让指针向右挪动一个next,直到两个链表中有一个链表为空,此时让新链表指向不为空的链表即可。 /** * Definition for singly-

诶你爱我吗的博客 195
上一篇: Leetcode算法——20、判断有效括号
下一篇: 归并排序详解(附python实现)
HappyRocking
博客等级 码龄12年 222粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值