首页/新闻资讯/正文详情

链表相加算法解析与Java实现

发布时间:2026/11/5 4:19:38 来源:云帆数科 栏目:资讯中心
链表相加算法解析与Java实现
1. 链表相加算法解析与实现两数相加是LeetCode上经典的链表操作题目编号为第2题。这道题考察了对链表数据结构的理解、指针操作以及数学进位处理能力。题目要求我们将两个用链表逆序表示的非负整数相加并返回同样逆序存储的和的链表。提示链表逆序存储意味着链表的第一个节点表示数字的最低位个位这与我们日常书写数字的顺序相反但恰好符合加法运算从低位到高位的计算顺序。1.1 问题描述与示例分析题目给出两个非空的链表每个节点存储一位数字且数字以逆序方式存储。例如链表[2,4,3]表示数字342链表[5,6,4]表示数字465我们需要实现一个函数将这两个链表表示的数字相加并返回表示和的链表。按照上面的例子342 465 807所以应该返回[7,0,8]。题目还给出了三个测试用例输入[2,4,3]和[5,6,4]输出应为[7,0,8]输入[0]和[0]输出应为[0]输入[9,9,9,9,9,9,9]和[9,9,9,9]输出应为[8,9,9,9,0,0,0,1]1.2 链表数据结构定义在Java中链表节点通常定义为static class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val val; } ListNode(int val, ListNode next) { this.val val; this.next next; } }每个ListNode包含两个属性val当前节点存储的数字0-9next指向下一个节点的指针2. 算法思路与实现细节2.1 基本思路解决这个问题的关键在于模拟手工加法的过程从最低位链表头开始相加处理进位如果两数相加大于等于10则向高位进1处理链表长度不一致的情况短链表的高位视为0最后检查是否还有进位需要处理2.2 核心算法实现下面是完整的Java实现代码public static ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry 0; // 进位标志 ListNode result new ListNode(0); // 结果链表的哑节点 ListNode sum result; // 当前节点指针 while (l1 ! null || l2 ! null || carry ! 0) { int n1 (l1 ! null) ? l1.val : 0; // 获取l1当前位的值如果l1已经遍历完则为0 int n2 (l2 ! null) ? l2.val : 0; // 获取l2当前位的值如果l2已经遍历完则为0 sum.next new ListNode((n1 n2 carry) % 10); // 计算当前位的和 sum sum.next; carry (n1 n2 carry) / 10; // 计算进位 if (l1 ! null) l1 l1.next; // 移动l1指针 if (l2 ! null) l2 l2.next; // 移动l2指针 } return result.next; // 返回哑节点的下一个节点即真正的结果链表头 }2.3 关键点解析哑节点的使用我们创建一个val为0的哑节点作为结果链表的起始点这样可以简化代码避免处理空链表的特殊情况。最后返回的是result.next。循环条件while (l1 ! null || l2 ! null || carry ! 0)这个条件确保了只要l1或l2还有节点未处理就继续循环即使l1和l2都处理完了如果还有进位也需要继续处理进位处理(n1 n2 carry) % 10计算当前位的值(n1 n2 carry) / 10计算进位值链表长度不一致的处理当其中一个链表已经遍历完时使用三元运算符将其值视为0这样就能继续与另一个链表的剩余部分相加。3. 复杂度分析与边界条件3.1 时间复杂度分析算法的时间复杂度是O(max(m,n))其中m和n分别是两个链表的长度。这是因为我们需要遍历两个链表中较长的那个的所有节点。3.2 空间复杂度分析空间复杂度也是O(max(m,n))因为我们需要创建一个新的链表来存储结果最坏情况下结果链表的长度会比输入链表中最长的那个多1因为有进位。3.3 边界条件考虑编写这类算法时需要考虑以下边界条件两个链表长度不一致最高位相加后有进位如99911000其中一个链表为空根据题目描述这种情况不会出现两个链表都只有一个节点且相加无进位如235两个链表都只有一个节点且相加有进位如55104. 测试用例验证让我们详细分析题目提供的三个测试用例4.1 测试用例1342 465 807输入l1 [2,4,3]表示342l2 [5,6,4]表示465执行过程257无进位 → [7]4610写入0进位1 → [7,0]3418无进位 → [7,0,8] 输出[7,0,8]表示8074.2 测试用例20 0 0输入l1 [0]l2 [0]执行过程000无进位 → [0] 输出[0]4.3 测试用例39999999 9999 10009998输入l1 [9,9,9,9,9,9,9]表示9999999l2 [9,9,9,9]表示9999执行过程9918 → [8]进位199119 → [8,9]进位199119 → [8,9,9]进位199119 → [8,9,9,9]进位190110 → [8,9,9,9,0]进位190110 → [8,9,9,9,0,0]进位190110 → [8,9,9,9,0,0,0]进位10011 → [8,9,9,9,0,0,0,1] 输出[8,9,9,9,0,0,0,1]表示100099985. 常见问题与调试技巧5.1 常见错误忘记处理最后的进位例如计算55时结果应该是[0,1]但如果循环条件不检查carry可能会只返回[0]。链表指针移动错误在移动l1和l2指针时需要先检查是否为null否则会抛出NullPointerException。结果链表构建错误容易犯的错误是忘记更新当前节点指针导致所有节点都链接到第一个节点上。5.2 调试技巧打印中间结果在循环中加入打印语句输出当前位的计算结果和进位值。可视化链表可以编写一个辅助方法打印链表方便查看中间结果。单元测试除了题目提供的测试用例外还应该自己设计一些边界情况的测试用例。5.3 性能优化虽然这个算法已经是最优解但仍有几点可以注意避免不必要的对象创建在实际情况中如果允许修改输入链表可以考虑复用节点来减少内存分配。并行计算对于特别长的链表可以考虑并行计算不同区段的和但会增加实现复杂度。6. 算法扩展与变种6.1 数字正序存储的情况如果链表是正序存储数字即第一个节点是最高位该如何处理这种情况下我们可以先将两个链表反转然后使用本算法或者使用栈来反转数字的顺序也可以递归地从后向前计算6.2 多个数字相加如果有多个链表需要相加可以扩展本算法使用一个变量来累加所有链表当前位的和然后计算当前位值和进位。6.3 不同进制的情况如果不是十进制相加而是其他进制如二进制、十六进制只需要修改进位计算的部分即可int base 16; // 以十六进制为例 sum.next new ListNode((n1 n2 carry) % base); carry (n1 n2 carry) / base;7. 实际应用场景这种链表相加的算法在实际中有多种应用大整数运算当数字太大无法用基本数据类型表示时可以用链表或数组来存储并使用类似的算法进行运算。高精度计算科学计算中需要高精度时这种逐位计算的方法非常有用。数字货币区块链技术中的一些计算也涉及大数运算。8. 不同语言的实现对比虽然我们使用Java实现了这个算法但了解其他语言的实现方式也很有帮助8.1 Python实现def addTwoNumbers(l1, l2): dummy ListNode(0) current dummy carry 0 while l1 or l2 or carry: val1 l1.val if l1 else 0 val2 l2.val if l2 else 0 total val1 val2 carry carry total // 10 current.next ListNode(total % 10) current current.next l1 l1.next if l1 else None l2 l2.next if l2 else None return dummy.next8.2 C实现ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dummy new ListNode(0); ListNode* current dummy; int carry 0; while (l1 || l2 || carry) { int val1 l1 ? l1-val : 0; int val2 l2 ? l2-val : 0; int total val1 val2 carry; carry total / 10; current-next new ListNode(total % 10); current current-next; l1 l1 ? l1-next : nullptr; l2 l2 ? l2-next : nullptr; } return dummy-next; }不同语言的实现思路基本相同主要区别在于语法细节和指针/引用的处理方式。9. 个人实现心得在实际实现这个算法时我总结了以下几点经验哑节点的使用一开始我尝试不使用哑节点结果发现需要处理很多特殊情况。使用哑节点后代码简洁了很多。循环条件的设置最初我只检查了l1和l2是否为null忽略了最后的进位导致一些测试用例失败。后来加上carry ! 0的条件后才完全正确。代码可读性将n1和n2的提取单独写成一行而不是直接写在计算表达式中虽然多了一行代码但可读性大大提高。测试的重要性自己编写测试用例时应该包括各种边界情况如只有进位、链表长度相差很大等情况。

相关推荐

SAP ERP系统架构与数字化转型实战解析
SAP ERP系统架构与数字化转型实战解析

1. SAP ERP系统与企业数字化转型全景在制造业龙头企业的IT部门工作十几年,我见证了SAP系统从R/3时代到S/4HANA Cloud的完整演进历程。今天要分享的不仅是技术架构解析,更是企业级ERP系统在云原生和AI时代的第一手实战经验。SAP作为全球领先的企业管理软件… · 2026/11/5 4:19:38

代码管理工具选型指南:GitHub、Gitee与GitLab对比
代码管理工具选型指南:GitHub、Gitee与GitLab对比

1. 代码管理工具的选择困境作为国内开发者,我们每天都要面对一个看似简单却影响深远的决策:该用哪个代码管理工具?这个问题背后涉及版本控制、团队协作、代码安全等多重考量。十年前可能只需要掌握SVN就够了,但如今Git生态下各种平… · 2026/11/5 4:19:38

纯C++轻量信号槽:基于Poco的跨平台事件通信实现
纯C++轻量信号槽:基于Poco的跨平台事件通信实现

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt环境下复现信号与槽机制的核心思想,解决纯C项目中对象解耦通信的常见需求。项目基于跨平台网络库Poco的事件系统实现类Qt风格的信号发射与槽函数绑定,并采用CMakeLis… · 2026/11/5 4:19:38

RenoDX 快速上手指南:DirectX 游戏着色器替换与画面升级
RenoDX 快速上手指南:DirectX 游戏着色器替换与画面升级

RenoDX 快速上手指南:DirectX 游戏着色器替换与画面升级 【免费下载链接】renodx Renovation Engine for DirectX Games 项目地址: https://gitcode.com/GitHub_Trending/re/renodx RenoDX(全称 "Renovation Engine for DirectX Games"… · 2026/11/5 5:13:00

新手 3 步开启 FreeTube 护眼模式:深色主题 + 系统联动,一晚上就看清差别
新手 3 步开启 FreeTube 护眼模式:深色主题 + 系统联动,一晚上就看清差别

新手 3 步开启 FreeTube 护眼模式:深色主题 系统联动,一晚上就看清差别 凌晨刷完一集,眼睛发酸、干涩得想闭会儿——这个场景熟不熟悉?FreeTube 是一款主打隐私的开源 YouTube 客户端,护眼方面它给的东西不多但都实用… · 2026/11/5 5:13:00

readmex生成效果全解析:一份让项目颜值飙升的README是怎么炼成的
readmex生成效果全解析:一份让项目颜值飙升的README是怎么炼成的

【免费下载链接】readmeX An AI Powered README and Interactive Wiki Generator for Any Projects. AI驱动的README及交互式Wiki生成工具,面向中文的开源DeepWiki。 项目地址: https://gitcode.com/gh_mirrors/rea/readmeX 点击查看 免费下载 你的项目… · 2026/11/5 5:13:00

猫抓 cat-catch 使用指南:开源网页视频嗅探插件,从安装到 M3U8 合并下载
猫抓 cat-catch 使用指南:开源网页视频嗅探插件,从安装到 M3U8 合并下载

猫抓 cat-catch 使用指南:开源网页视频嗅探插件,从安装到 M3U8 合并下载 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫… · 2026/11/5 5:13:00

用 Driver Store Explorer 清理旧驱动,释放 Windows 系统盘空间
用 Driver Store Explorer 清理旧驱动,释放 Windows 系统盘空间

用 Driver Store Explorer 清理旧驱动,释放 Windows 系统盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer Driver Store Explorer(RAPR)是一个开… · 2026/11/5 5:13:00

FreeTube路线图:未来版本将带来的10大新特性
FreeTube路线图:未来版本将带来的10大新特性

FreeTube路线图:未来版本将带来的10大新特性 FreeTube作为一款注重隐私保护的开源YouTube客户端(当前版本v0.23.9),始终致力于为用户提供更安全、更自由的视频观看体验。随着技术的不断发展,开发团队正积极推进多项创… · 2026/11/5 5:12:00

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码