【LeetCode 力扣】2.两数相加 Java实现 模拟 递归

【力扣Leetcode解题系列之0002. 两数之和Add Two Numbers:链表与数学运算的完美结合】 力扣2题"Add Two Numbers"是一道经典的链表加法问题,要求将两个逆序存储数字的链表相加并返回结果链表。解题关键在于模拟十进制加法过程,处理不同长度链表和进位问题。主要有两种解法:循环法和递归法。循环法通过遍历链表逐位相加,处理进位;递归法则通过递归调用处理后续节点和进位。两种方法的时间复杂度均为O(max(M,N)),空间复杂度为O(1)。题目考察了链表操作和数学运算的结合能力,是算法练习的典型范例。 阅读详情

题目链接:2.两数相加

1 原题描述:

![在这里插入图片描述](https://img-blog.csdnimg.cn/1b444ba8fb89475b93342533a1604d52.png

2 解题思路

初看此题,其实并不难理解,我们只需要简单对加法过程进行一个模拟,即可完成。那么我们应该怎么模拟呢?首先观察题目,链表是采用的 逆序 存储,这很明显是为了方便我们进行 进位,这样我们可以按照链表的顺序,将两个链表的当前值相加,相加后的值为sum 。sum % 10 即为当前位数的值,sum / 10 即为进位的值。因为考虑到有进位的情况,我们不能直接写 s u m = l 1. v a l + l 2. v a l sum = l1.val + l2.val sum=l1.val+l2.val 而是应该写成 s u m + = l 1. v a l + l 2. v a l sum += l1.val + l2.val sum+=l1.val+l2.val,这样就可以把进位的值加入。为了确保第一次相加时不被进位影响,我们只需要将 sum 的 初始值 设为 0 即可。对于链表最后一位相加后还有进位的情况,我们只需要在两个链表走完后,判断一下 sum 是否为1,若为1将其再插入。

基础的逻辑我们理顺了,那么我们现在要考虑一个特殊情况了。前面我们思考的时候都是假定两个链表的长度相等,那如果两个链表不等长呢?因此在相加循环的时候,若一个链表走到了末尾变成了null,那么我们就要停止相加。然后判断两个链表谁还有值,再将其剩下的值直接拼接上即可。(注意:此处我们依然要考虑进位的情况,例如 99 + 1 99 + 1 99+1,两个链表长度相等的部分 9 + 1 = 10 9 + 1 = 10 9+1=10,产生了进位,拼接99剩下的一个9时也需要把这个进位考虑到。)

逻辑理顺了,那就让我们来看看代码吧,实现代码如下。可能大家对代码两处有疑点,一是为什么要声明两个链表 res 和 res1 ? 因为该链表结构为单向,我们只能往下走,而不能往回走,因此res 是用来记录我们相加后的值的链表是从哪里开始的,res2 是用来添加我们计算出来的新值的。第二个疑点可能是,为什么返回的是 res.next 而不是 res ?正如前文所述,我们 res 是用来记录链表是哪里开始的,而我们 res 的初始值是我们随便 赋予 的一个0,真正的结果是从 res.next 开始的。

代码实现1:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res = new ListNode(0);
        ListNode res2 = res;
        int sum = 0;
        while(l1 != null && l2 != null){
            sum += l1.val + l2.val;
            res2.next = new ListNode(sum % 10);
            res2 = res2.next;
            sum /= 10;
            l1 = l1.next;
            l2 = l2.next;
        }
        while(l1 != null){
            sum += l1.val;
            res2.next = new ListNode(sum % 10);
            res2 = res2.next;
            sum /= 10;
            l1 = l1.next;
        }
        while(l2 != null){
            sum += l2.val;
            res2.next = new ListNode(sum % 10);
            res2 = res2.next;
            sum /= 10;
            l2 = l2.next;
        }
        if (sum != 0){
            res2.next = new ListNode(sum % 10);
        }
        return res.next;
    }
}

虽然说,如上的思路很简单,但整个代码很繁琐,一点也不优雅。那我们还有其他思路吗?我们可以发现,每一个 l.next 都还有自己的 next,那我们是不是可以利用递归,计算出最后一个 next 然后以此返回给上一个 next 呢?

答案是肯定的,那我们应该怎么判断递归是否结束了呢?什么时候不需要接着往下继续传值呢?我们分析一下,首先 l1 或者 l2 只要有一个不为空,那么我就要继续调用下去。对此可能有小伙伴有疑问了,针对两个链表若只有一个为空时,我们应该怎么相加呢?其实很简单,对于为空的情况下我们只需要 new 一个为 0 的节点就行了。除了上面说的这个情况,还有两个链表都为 null 但我还能进位的情况下(即 s u m > = 10 sum >= 10 sum>=10),也需要继续计算。

那么很轻松的,我们递归实现的代码也就出来了!

代码实现2:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       int sum = l1.val + l2.val;
       ListNode res = new ListNode(sum % 10);
       if(l1.next != null || l2.next != null || sum >= 10){
       		if (l1.next != null) l1 = l1.next;
            else l1 = new ListNode(0);
            if (l2.next != null) l2 = l2.next;
            else l2 = new ListNode(0);
            l1.val += sum / 10;
            res.next = addTwoNumbers(l1, l2);
        }
        return  res;
    }
}
自定义控件三部曲视图篇(六)——RecyclerView系列之三自定义LayoutManager 前言:把握生命里的每一分钟,全力以赴我们心中的梦,不经历风雨 怎么见彩虹,没有人能随随便便成功 在第一篇中已经讲过,LayoutManager主要用于布局其中的Item,在LayoutManager中能够对每个Item的大小,位置进行更改,将它放在我们想要的位置,在很多优秀的效果中,都是通过自定义LayoutManager来实现的,比如: 可以看到这些效果都非常棒,通过这一节的学习,大... 阅读详情

相关推荐

利用Python实现FGO自动战斗脚本

Fate/Grand Order(非的肝不过欧的)作为索尼为了拯救自己不倒闭而开发的面向月厨的骗氪养成抽卡爆肝游戏,居然没有像隔壁《阴阳师》的自动战斗系统(看看别人现在都自带脚本了)。毕竟是懒得肝,就不妨写一个脚本来肝算了,省时省力。 开始 一个战斗脚本,其实可以算是AI的初步了。虽然只是暴力算出造成最大伤害的方案orz。 我们在这里不考虑释放 技能 、 宝具 和 暴击星 这三样非常重要的东西。...

web开发与Python 5485

LeetCode-两数相加(java递归)

LeetCode-两数相加(java递归) 这是 力扣 上的第二题:两数相加,也是刚开始接触力扣刷题,这道中等难度的算法题还是耗费了不少时间解出来,觉得还挺有意思,所以想把过程和自己的思路记录下来,废话不多说,直接上解题思路。 解题思路: 本题解法是递归实现。解题思路其实很简单,题目给的需求是两个链表相加,每个节点位置存放的数字和只能是0-9区间,那么就需要满10进1,进位值暂且用carry表示,由此得出: n1+n2+carry。 最直接的解题思路就是递归:每次当前两个节点相加,然后递归相加这两个节点的

可口可乐 579

信息隐藏 数字图像空域隐写与分析技术的实现

【代码】信息隐藏 数字图像空域隐写与分析技术的实现。

Yungoal的博客 468

两数相加

两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9

weixin_43014149的博客 993

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案

深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。

Cheson的专栏 1358

手把手教你学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

MHD0815的博客 146

力扣LeetCode算法题第2题-两数之和

力扣LeetCode算法题-两数之和

逼哥很疯狂的博客 790

工业级C#+YOLOv8缺陷检测系统:准确率98.5%、延迟<50ms的完整实现

本文分享了基于C#和YOLOv8的工业级表面缺陷检测系统实现方案。针对汽车零部件冲压件检测需求(60件/分钟,准确率>98%,延迟<100ms),作者对比了多种技术方案后选择了C#+YOLOv8+ONNX Runtime的组合,最终实现98.5%准确率和42ms延迟。 系统采用分层模块化架构,包含硬件层、采集层、推理层、业务层和控制层。核心优势包括:1)C#在工业环境下的稳定性和集成便利性;2)YOLOv8对复杂缺陷的泛化能力;3)ONNX Runtime GPU加速提升性能。文章详细介绍了硬件

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1140

【LeetCode】2. 两数相加

题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,9,9]

记录、总结 1504

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述

总结与展望先总结现状,说明前人已经做到什么地步了,再指出缺口,前人没解决什么问题、方法有什么局限等等,最后再在这个缺口的基础上,提出你的未来研究方向。当你有个复杂的研究题目,但没办法拆解出关键词,就可以让Gemini 3 Pro来辅助帮你拆解,并帮你写专业的检索式,若是找英文文献,还能帮你将中文关键词翻译成地道的专业术语。做文献笔记,可以建立文献笔记矩阵,可以用Excel建个表格,横向是文献,纵向是关键要素,包括作者/年份、研究问题/假设、理论框架/模型、研究方法/数据来源、核心结论、局限性/Gap。

智能AI让学术科研更容易 992

力扣 #1.两数之和 JAVA实现

力扣 #1.两数之和 JAVA实现

weixin_54525144的博客 337

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(LeetCode-Hot100)2. 两数相加

摘要: LeetCode两数相加问题要求将两个逆序存储数字的链表相加,返回结果链表。推荐使用模拟加法的方法:初始化虚拟头节点和进位变量,循环处理每位相加,计算当前位和进位,创建新节点。时间复杂度O(max(m,n)),空间复杂度O(max(m,n))。需注意进位处理、链表长度差异和最终进位。示例演示验证了算法的正确性,数学归纳法证明其有效性。避免转换为数字的方法以防溢出。关键点包括逆序理解、进位逻辑和边界处理。

小飞的博客 832

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode 经典题:“两数相加”

两数相加”这道题虽然难度定位为简单,但它很好地考察了链表的基本操作和进位处理的逻辑。通过模拟逐位相加和递归两种不同的解法,我们可以看到不同编程思想的应用。模拟方法直观易懂,适合初学者理解链表操作;递归方法则展示了代码的简洁性和问题分解的魅力。在实际编程中,我们可以根据具体需求和场景选择合适的解法。希望通过对这道题的详细剖析,能帮助大家加深对链表操作和算法设计的理解,提升编程能力。

jukuya的博客 1038

Java详解LeetCode 热题 100(28):LeetCode 2. 两数相加(Add Two Numbers)详解

*** 单链表节点的定义*/int val;// 节点的值// 指向下一个节点的指针// 无参构造函数// 带值的构造函数// 带值和下一个节点的构造函数第一步:理解基础概念掌握链表的基本操作理解逆序存储数字的含义学会手工模拟竖式加法第二步:掌握基础解法理解哨兵节点的作用掌握进位的处理方法练习基础的迭代法实现第三步:学习高级技巧理解递归解法的思路学习代码优化技巧掌握边界条件的处理第四步:拓展应用学习相关算法问题理解算法在实际中的应用。

yk_dflkg的博客 1533

详解 LeetCode_002_两数相加(Java 实现)

两数相加的解决方案题目描述总体分析解决方案方案 1方案 2方案 3三种方案的对比小结 题目描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> ...

踏雪彡寻梅的博客 543

LeetCode 2.两数相加(热门题解汇总-基于Java)

本文分析汇总了LeetCode两数相加问题的三种题解:递归法,预先指针和运用加法万能模板。

2401_88038564的博客 929

两数相加 Java

LeetCode题目-两数相加

zhanglei1147的博客 1028

leetcode 2. 两数相加(java)

给你两个 非空 的链表,表示两个非负的整数。输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值。,则保留个位数字,同时向前一位进 1 如果最高位有进位,则需在最前面补。如果两个链表全部遍历完毕后,进位值为 1,则在新链表最前方添加节点 1。输入:l1 = [2,4,3], l2 = [5,6,4]输入:l1 = [0], l2 = [0]输出:[8,9,9,9,0,0,0,1]输出:[7,0,8]

SP_1024的博客 447

2. 两数相加

当前位 = 求和取余;下一位 = 递归算进位。模拟小学数学竖式加法。每一层的任务是:算出当前位的数字 (sum % 10),并将进位 (sum / 10) 甩给下一层递归去处理。

一同进步 566

【LeetCode】2. Add Two Numbers 两数相加

【LeetCode】2. Add Two Numbers 两数相加 LeetCode, fuxuemingzhu, 负雪明烛,题解,链表,求加法,力扣,Python, C++, Java 题目描述: You are given two non-empty linked lists representing two non...

负雪明烛 1万+

【LeetCode刷题】2两数相加

给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。[1, 100]

Catherinemin的博客 249

【经典算法】LeetCode 2两数相加(Java/C/Python3/Go实现含注释说明,中等)

方式优点缺点时间复杂度空间复杂度其他迭代方式- 直观易懂,易于实现- 代码相对较长m和n分别为两个链表的长度递归方式- 代码简洁,易于理解- 可能存在栈溢出风险(链表过长时)O(max(m, n))(递归栈空间)或 O(1)(不考虑递归栈)递归深度受链表长度限制。

1393

Leetcode: 0001-0010题速览

Leetcode: 0001-0010题速览

qq_53481114的博客 2662

LeetCode 02:“两数相加”,小学加法运算而已?

一道小学加法题,竟然在LeetCode上被标记为“中等”难度,有些人“流下了没有技术的眼泪”,有些人“一顿操作猛如虎,一看击败百分五……”。今天我们来看看LeetCode的第二道题“两数相加”。 “两数相加” 先来看题目描述,对应官方链接:https://leetcode-cn.com/problems/add-two-numbers 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除

程序新视界 709

【数据结构与算法】leetcode刷题记录(两数之和+两数相加)

文章目录两数之和java解决方案:python3解决方案两数相加python解法:java实现 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] java解决方案: 1.暴力枚举:(不会有人不会枚举吧,不会吧不会吧) for循环,读取数组的大小,从0

qq_44126342的博客 290
上一篇: 我的创作纪念日
下一篇: 【LeetCode 力扣】3.无重复字符的最长子串 Java实现 滑动窗口
爱写BUG的老冉
博客等级 码龄8年 2357粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值