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

链表题解——两数相加【LeetCode】

方法一:递归

写法一:创建新节点

算法思路解析

该实现采用 递归方式 逐位处理两个链表,并考虑进位 carry

✨ 步骤拆解
  1. 递归终止条件:当 l1, l2 都为空且没有进位(carry == 0),说明加法结束,返回 None

  2. 当前位求和:s = carry + l1.val (如果有) + l2.val (如果有)

  3. 计算当前节点的值与进位:当前节点值为 s % 10,进位为 s // 10

  4. 递归构造下一节点:递归调用 addTwoNumbers(l1.next, l2.next, carry) 处理下一位

  5. 创建当前节点并连接:使用 ListNode(s % 10, next_node) 构造当前节点并返回

class Solution:# l1 和 l2 为当前遍历的节点,carry 为进位def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode], carry=0) -> Optional[ListNode]:if l1 is None and l2 is None and carry == 0:  # 递归边界return Nones = carryif l1:s += l1.val  # 累加进位与节点值l1 = l1.nextif l2:s += l2.vall2 = l2.next# s 除以 10 的余数为当前节点值,商为进位return ListNode(s % 10, self.addTwoNumbers(l1, l2, s // 10))

时间与空间复杂度分析

时间复杂度:O(max(m, n))
  • 每次递归处理一个节点,最多递归 max(m, n) 层(m 和 n 为两个链表的长度)。

空间复杂度:
类型复杂度说明
递归栈空间O(max(m, n))每层递归入栈一次
结果链表空间O(max(m, n) + 1)存储最终和(可能有一个额外的进位位)

⚠️ 注意:这是递归写法,存在函数栈空间占用,若链表极长(如上千位),可能导致栈溢出风险(可改为迭代方式避免)。

相关文章:

  • 雷卯针对灵眸科技EASY Orin-nano RK3516 开发板防雷防静电方案
  • 【数据分析,相关性分析】Matlab代码#数学建模#创新算法
  • 远眺科技工业园区数字孪生方案,如何实现智能管理升级?
  • java+vue+SpringBoo数字科技风险报告管理系统(程序+数据库+报告+部署教程+答辩指导)
  • ESP32 008 MicroPython Web框架库 Microdot 实现的网络文件服务器
  • QT Creator的返回到上一步、下一步的快捷键是什么?
  • Python Async 编程快速入门 | 超简明异步协程指南
  • Prism框架实战:WPF企业级开发全解
  • 从萌芽到领航:广州华锐互动的 AR 奋进之路​
  • oracle内存参数调整
  • 免安装一键修复网络诊断 + 权限修复!打印机共享错误工具适配 Win7/10/11
  • 集群聊天服务器---muduo库(3)
  • PHP Protobuf 手写生成器,
  • Redis集群实现方式
  • 鸿蒙HarmonyOS 关于图片、视频的选择详解
  • react ant-design通用页面自适应适配不同分辨率屏幕的方法工具类
  • 2025年消防设施安全员考试新增了哪些内容?重点考什么设备?
  • AiPy实战(5):效率革命!5分钟构建行业分析报告
  • SpringBoot -- 整合Junit
  • flink同步kafka到paimon,doris加速查询