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], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,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; }* }*/
/**       x+y*   2 3 4 5 6 7 (x)*         * +     4 7 2 5 (y)** = 2 3 9 2 9 2  **/
class Solution {//进行逻辑计算的节点public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//任何相加的节点不存在时,直接返回另外一个节点结果,例如x的万位为3,y没有万位,那么万位相加的结果直接得出是3if(l1==null){return l2;}if(l2==null){return l1;}//计算当前节点,比如x与y的个位相加 7+5,那么sum为12int sum =l1.val+l2.val;//计算余数,12%10=2,head为当前位保存的数也就是2。ListNode head = new ListNode(sum%10);//计算个位的下一位十位,十位进入递归方法,也就是x的十位6与y的十位2进行相加。递归方法返回的是head,也就是对应位保存的数,我们可知(6+2)%10=8。所以当前head.next=8。head.next=addTwoNumbers(l1.next, l2.next);//当前对应位相加结果sum是12>9,所以需要计算下一位的值8与进位1相加。也就是8与1相加=9if(sum>9){//所以得出下一位十位的实际值为9。head.next=addTwoNumbers(head.next, new ListNode(1));}//返回当前对应位节点。return head;}
}

可知,递归的意义就是在递归中,不断的向next也就是高位计算,在计算出个位结果后,需要计算十位的结果,并将十位的节点挂在当前节点之next,且需要判断是否进位,如果需要进位,那么需要将进位的1与next再进入递归进行相加。为什么需要再进入递归相加,而不是进行普通相加计算,因为如果下一位是9,那么进位的1又会与9相加并进位,因此进位的相加也需要进入递归。

 我们还需要注意的一点,这里我们发现对应位(也就是个位与个位相加,十位与十位相加,百位与百位相加)的相加递归,和进位与下一位 相加的递归是两个递归方法,仔细思考这样是没问题的,我们心算的时候,甚至可以不管是否进位,可以先算对应位的相加,最后再计算进位相加。

  *   2 3 4 5 6 7 (x)
 *         
 * +       4 7 2 5 (y)

比如不管进位的情况下

相加计算的结果是 238282。

我们再来另外计算进位,可知十位需要进位1相加,千位需要进位1相加。

那么结果是239292。与正确结果相符。所以这里我们不要受到必须计算进位与下一位的结果,才计算下下一位的相加结果,因此进位的递归相加,和对应位的递归相加,可以是两个递归方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/520510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造经典游戏:HTML5与CSS3实现俄罗斯方块

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

springboot 实现登录注册

文章目录 前言登录功能前台后台逻辑 退出登录前台 使用jwt在后端进行鉴权引入依赖给后台接口加上统一的前缀/api&#xff0c;开始Jwt配置 注册功能前台后台 前言 本文将整合简单的登录注册功能。 登录功能 前台 构造前台页面 <template><div><div style&qu…

基础数据运营 - 面经 - 自如租房

招聘要求&#xff1a; 投递时间&#xff1a; 2023.12.28 BOSS直聘 联系HR 2023.12.29 面试 面试流程&#xff1a; 自我介绍&#xff0c;正常完整表述 你能介绍一下你的实习经历吗&#xff1f;主要做了哪些工作&#xff0c;得到了哪些结论出来 一般Excel有用到过么&#x…

基于qt的图书管理系统----05其他优化

参考b站&#xff1a;视频连接 源码github&#xff1a;github 目录 1 优化借阅记录显示2 时间显示为年月日3 注册接口 1 优化借阅记录显示 现在只能显示部分信息&#xff0c;把接的书名和人的信息全部显示 在sql语句里替换为这一句即可实现查询相关联的所有信息 QString str…

基于AM62X+FPGA/MCU的B码对时定制化整机解决方案

什么是IRIG-B码对时 IRIG-B(inter-range instrumentationgroup-B)码是一种时间同步标准&#xff0c;通常用于精确的时间测量和数据同步&#xff0c;广泛应用于电力、通信、航空等领域。 IRIG-B码为每秒一帧的时间串码&#xff0c;一帧串码中包含100个码元&#xff0c;频率为1K…

【嵌入式】嵌入式系统稳定性建设:静态代码扫描的稳定性提升术

1. 概述 在嵌入式系统开发过程中&#xff0c;代码的稳定性和可靠性至关重要。静态代码扫描工具作为一种自动化的代码质量检查手段&#xff0c;能够帮助开发者在编译前发现潜在的缺陷和错误&#xff0c;从而增强系统的稳定性。本文将介绍如何在嵌入式C/C开发中使用静态代码扫描…

Java面试篇【并发编程】常见面试题(2024最新)

Java并发编程常见面试题 1.什么是线程和进程&#xff1f; 进程是操作系统分配资源的最小单位&#xff0c;各个进程之间占据独立的寻址空间&#xff0c;运行也是独立运行&#xff0c;进程间通信需要一些机制。进程间切换需要的开销较大。 线程是程序执行的基本单位&#xff0c…

Python数据处理实战(4)-上万行log数据提取并作图进阶版

系列文章&#xff1a; 0、基本常用功能及其操作 1&#xff0c;20G文件&#xff0c;分类&#xff0c;放入不同文件&#xff0c;每个单独处理 2&#xff0c;数据的归类并处理 3&#xff0c;txt文件指定的数据处理并可视化作图 4&#xff0c;上万行log数据提取并作图进阶版&a…

Vue中项目使用debugger,浏览器无效!

现象&#xff1a;下载了别的项目&#xff0c;启动之后&#xff0c;打了debugger&#xff0c;结果浏览器居然忽视&#xff0c;直接过去。打一堆日志&#xff0c;太麻烦了。 解决方案 第一步 F12打开浏览器调试器&#xff0c;找到设置 第二步 如果是英文的&#xff0c;找这…

扩展学习|系统理解数字经济

文献来源&#xff1a;[1]肖静华,胡杨颂,吴瑶.成长品&#xff1a;数据驱动的企业与用户互动创新案例研究[J].管理世界,2020,36(03):183-205.DOI:10.19744/j.cnki.11-1235/f.2020.0041. [2]陈晓红,李杨扬,宋丽洁等.数字经济理论体系与研究展望[J].管理世界,2022,38(02):208-22413…

Java毕业设计 基于SpringBoot vue 疫苗咨询与预约系统

Java毕业设计 基于SpringBoot vue 疫苗咨询与预约系统 SpringBoot vue 疫苗咨询与预约系统 功能介绍 用户前端&#xff1a;首页 图片轮播 疫苗信息 条件查询 疫苗详情 点我收藏 评论 接种疫苗 疫情资讯 资讯详情 资讯评论 论坛交流 发布帖子 公告信息 公告详情 留言反馈 登录…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码&#xff0c;往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时&#xff0c;就会把内存中的数据先读出来&#xff0c;加载到cpu寄存器中&#xff0c;再去参与运算。 但是&#xff0c;关键是cpu读…