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

leetcode 21 合并两个有序链表

问题描述

LeetCode 21 题要求将两个升序排列的链表合并为一个新的升序链表。合并后的链表应通过拼接原链表的节点完成,而非创建新节点。

解题思路

递归法

看这个评论区的图解,便于理解

https://leetcode.cn/problems/merge-two-sorted-lists/solutions/103891/yi-kan-jiu-hui-yi-xie-jiu-fei-xiang-jie-di-gui-by-

  • 比较两个链表当前节点的值,将较小节点作为合并后链表的头节点。
  • 递归调用函数处理剩余部分,将较小节点的 next 指向递归结果。
  • 终止条件:任一链表为空时,直接返回另一链表。

迭代法

迭代法的具体思路就是哪个节点的值更小,则将新的链表的next连给他,问题是新链表的头节点可能是l1或者l2,不确定,解决的方法是新建一个头节点,最后返回的时候返回他的next

  • 创建一个虚拟头节点 dummy 和指针 current 指向它。
  • 遍历两个链表,每次将较小的节点连接到 current 后,并移动对应链表的指针。
  • 当某一链表遍历完成后,将 currentnext 指向剩余链表。

代码实现

递归法 Python 示例

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:if list1 is None:return list2if list2 is None:return list1if list1.val <= list2.val:list1.next = self.mergeTwoLists(list1.next,list2)return list1else:list2.next = self.mergeTwoLists(list1,list2.next)return list2

迭代法 Python 示例

class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:# 首先采用哨兵解法,构造一个伪头节点dummy = cur = ListNode(0)while list1 and list2:if list1.val <= list2.val:cur.next = list1list1 = list1.nextelse:cur.next = list2list2 = list2.nextcur = cur.nextcur.next = list1 if list1 else list2return dummy.next

复杂度分析

  • 时间复杂度:O(m+n),其中 m 和 n 分别为两个链表的长度。
  • 空间复杂度
    • 递归法:O(m+n),栈空间取决于递归深度。
    • 迭代法:O(1),仅使用常数级额外空间。

边界条件

  • 其中一个链表为空时,直接返回另一链表。
  • 两个链表均为空时,返回空。

扩展思考

  • 如何合并 K 个有序链表?(LeetCode 23 题)
  • 如果链表为降序排列,如何调整代码?
  • 如何处理链表中的重复值?

文章转载自:

http://qWXvqbjH.yfmxn.cn
http://I0tqZmV1.yfmxn.cn
http://x39HhAsf.yfmxn.cn
http://ipgqpcSE.yfmxn.cn
http://4GE75gwH.yfmxn.cn
http://9q6sGQRV.yfmxn.cn
http://KVlJzgNB.yfmxn.cn
http://4qM5HBOn.yfmxn.cn
http://TqUjNcQd.yfmxn.cn
http://v4HiU8VJ.yfmxn.cn
http://f6Hmdj8b.yfmxn.cn
http://piOgoUQV.yfmxn.cn
http://UtNvsaUM.yfmxn.cn
http://CWam7EcK.yfmxn.cn
http://aM2bTJPO.yfmxn.cn
http://M2MvtpSP.yfmxn.cn
http://W3KTQhQ3.yfmxn.cn
http://7FGOfhfv.yfmxn.cn
http://7VmRff5o.yfmxn.cn
http://DF8E50sy.yfmxn.cn
http://GM7J1rec.yfmxn.cn
http://3XN8VBQG.yfmxn.cn
http://d3bEZk6W.yfmxn.cn
http://41tAx1aF.yfmxn.cn
http://KBs8gaHS.yfmxn.cn
http://1cLOhQyl.yfmxn.cn
http://JATNx84e.yfmxn.cn
http://8YLUMIU3.yfmxn.cn
http://RKqGdpT3.yfmxn.cn
http://X9kqrOAB.yfmxn.cn
http://www.dtcms.com/a/383690.html

相关文章:

  • OneCode 移动套件多平台适配详细报告
  • RAGAS新手入门教程:从基础到实践
  • 在 CentOS 中安装 VirtualBox 增强功能的步骤
  • 网络编程-day4
  • 学习笔记:第一个Python程序
  • Docker-compose.yml集群设置
  • 课后作业-2025-09-14
  • 软件工程实践一:Git 使用教程(含分支与 Gitee)
  • 知识贡献缺乏激励该如何改善
  • 一个冷门算法——Floyd判圈算法在Leetcode中的应用
  • 程晓明在链改 2.0 六方会谈首提 “双众筹 + 私交所” 回应 RWA 国内落地可行方案
  • 【车载audio开发】【基础概念1】【音频基础概念通俗讲解】
  • O3DE社区发布2505.0版本
  • VSCode 的 Run and Debug 下拉菜单都是怎么配置的,原理是什么?
  • Ligero 和 Brakedown PCS中的tensor product结构
  • 高效群签名方案与优化方法
  • [第一章] web入门—N1book靶场详细思路讲解(二)
  • 行优先 vs 列优先:性能差异揭秘
  • python把文件从一个文件复制到另一个文件夹
  • 平衡车 -- 遥控器
  • 深度学习(八):学习率
  • VSCode使用prettier插件进行格式化配置
  • 前后端分离项目如何解决跨域问题
  • IDEA使用Maven和MyBatis简化数据库连接(实现篇)
  • 【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
  • 正向代理与反向代理的异同
  • 从ENIAC到Linux:计算机技术与商业模式的协同演进——开源生态的崛起与重构
  • RTC驱动原理
  • MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
  • 构建日志采集和分析平台