尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【每日算法】两数相加 LeetCode - 教程

【每日算法】两数相加 LeetCode - 教程
📅 发布时间:2026/6/20 23:30:10

这段代码实现了一个名为 AddTwoNumbers 的方法,用于将两个用链表表示的非负整数相加,并返回一个新的链表表示它们的和。

public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
{
ListNode head = new ListNode(0);
ListNode cur = head;
int carry = 0;
while (l1 != null || l2 != null)
{
int x = l1 != null ? l1.val : 0;
int y = l2 != null ? l2.val : 0;
int sum = x + y + carry;
// 进位
carry = sum / 10;
// 当前节点 取余数
cur.next = new ListNode(sum % 10);
cur = cur.next;
if (l1 != null)
{
l1 = l1.next;
}
if (l2 != null)
{
l2 = l2.next;
}
}
if (carry > 0)
{
cur.next = new ListNode(carry);
}
return head.next;
}

以下是逐步解析:

1. 方法功能

  • 输入:两个链表 l1 和 l2 ,每个节点表示一个数字的一位(逆序存储,即个位在链表头部)。
  • 输出:一个新的链表,表示 l1 和 l2 相加的结果(同样逆序存储)。

2. 代码逐行解析

(1) 初始化虚拟头节点
ListNode head = new ListNode(0);
ListNode cur = head;
  • 作用:创建一个虚拟头节点 head ,用于简化链表操作。
  • cur 是一个指针,用于遍历和构建结果链表。
(2) 初始化进位
int carry = 0;
  • 作用:记录当前位的进位值(初始为 0 )。
(3) 遍历链表
while (l1 != null || l2 != null)
  • 条件:只要 l1 或 l2 中还有未处理的节点,就继续循环。
(4) 计算当前位的值
int x = l1 != null ? l1.val : 0;
int y = l2 != null ? l2.val : 0;
int sum = x + y + carry;
  • 逻辑:
    • 如果 l1 或 l2 已经遍历完,则用 0 代替。
    • sum 是当前位的和(包括进位)。
(5) 处理进位
carry = sum / 10;
  • 逻辑:计算新的进位值( sum / 10 的整数部分)。
(6) 创建新节点
cur.next = new ListNode(sum % 10);
cur = cur.next;
  • 逻辑:
    • sum % 10 是当前位的值(去掉进位后的个位数)。
    • 将新节点添加到结果链表中,并移动 cur 指针。
(7) 移动输入链表的指针
if (l1 != null)
{
l1 = l1.next;
}
if (l2 != null)
{
l2 = l2.next;
}
  • 逻辑:如果 l1 或 l2 未遍历完,则移动到下一个节点。
(8) 处理最后的进位
if (carry > 0)
{
cur.next = new ListNode(carry);
}
  • 逻辑:如果遍历结束后仍有进位( carry > 0 ),则在结果链表的末尾添加一个新节点。
(9) 返回结果
return head.next;
  • 作用:跳过虚拟头节点,返回真正的结果链表。

3. 关键点分析

(1) 逆序存储的优势
  • 链表的头部是个位,方便从低位到高位逐位相加。
  • 进位可以自然地向高位传递。
(2) 虚拟头节点的作用
  • 简化链表操作,避免单独处理头节点的情况。
(3) 时间复杂度
  • O(max(m, n)):其中 m 和 n 分别是 l1 和 l2 的长度。
  • 需要遍历较长的链表。
(4) 空间复杂度
  • O(max(m, n)):结果链表的长度最多为 max(m, n) + 1 (如果有进位)。

4. 示例验证

示例 1
l1 = 2 -> 4 -> 3(表示数字 342)
l2 = 5 -> 6 -> 4(表示数字 465)
// 输出:7 -> 0 -> 8(表示 342 + 465 = 807)
示例 2
l1 = 9 -> 9 -> 9(表示数字 999)
l2 = 1(表示数字 1)
// 输出:0 -> 0 -> 0 -> 1(表示 999 + 1 = 1000)
示例 3
l1 = null(表示数字 0)
l2 = 1 -> 2(表示数字 21)
// 输出:1 -> 2(表示 0 + 21 = 21)

5. 总结

  • 高效性:通过逐位相加和进位处理,实现了链表的数字加法。
  • 鲁棒性:处理了链表长度不一致和最后进位的情况。
  • 通用性:适用于任意长度的数字相加。

相关新闻

  • MacCAD2019.dmg 安装包使用教程|Mac电脑安装CAD2019全流程
  • 初始化一个rust环境
  • 编程里边有好多不容易触及的知识点

最新新闻

  • 2026年6月昆明好的旋转铝导轨抱夹供应商深度分析与选择指南 - 品牌鉴赏官2026
  • 3分钟掌握llama-bench:你的大语言模型性能优化终极指南
  • 终极MPV播放器UI指南:uosc如何用接近感应式设计改变你的观影体验
  • XXMI启动器:6款热门二次元游戏模组管理的技术实现与效率革命
  • Depth Anything 3实战指南:从单张图片快速构建3D场景
  • 工业洁净厂房车间装修隔墙材料规范及施工要点 - 华川洁净

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号