LeetCode题集-2 - 两数相加

news/2024/11/16 3:43:57/文章来源:https://www.cnblogs.com/hugogoos/p/18397329

这个题目是什么意思呢?简单来说就是把两个链表平铺开,头节点对齐,然后从头开始相同的节点相加,满10则进位,进位值与下个节点继续相加,当一个链表没有节点时候则可以把没有节点当做0继续与有节点的链表继续相加。具体示例如下:

到这里不知道你是否已经有解题思路了呢?

01、解法一:递归法

我第一反应就是递归,为什么?想想题目,对两个链表相同节点位置值按顺序求值,第一个算完算第二个,以此类推直至所有节点计算完成,这不正好使用递归吗,定义一个方法计算两个节点和,然后以头节点的下个节点作为递归点,即计算头节点后,头节点的下个节点计算直接调用自身方法直至所有节点计算完成,具体代码如下:

public static ListNode AddTwoNumbersRecursion(ListNode l1, ListNode l2)
{return AddTwoNumbersRecursive(l1, l2, 0);
}
private static ListNode AddTwoNumbersRecursive(ListNode l1, ListNode l2, int carry)
{//当两个链表节点都为空并且进位值等于0,则结束递归if (l1 == null && l2 == null && carry == 0){return null;}//以进位值为初始值定义两节点和变量,var sum = carry;//如果l1节点不为空,则累加其节点值,并且把其下个节点赋值给自身,用于下次迭代if (l1 != null){sum += l1.val;l1 = l1.next;}//如果l2节点不为空,则累加其节点值,并且把其下个节点赋值给自身,用于下次迭代if (l2 != null){sum += l2.val;l2 = l2.next;}//计算进位值carry = sum / 10;//以当前位值,创建下一个节点return new ListNode(sum % 10){//递归点next = AddTwoNumbersRecursive(l1, l2, carry)};
}

然后我们运行代码验证一下,结果如下:

02、解法二:迭代法

我们知道因为每次递归都会需要额外的栈空间,因此深度递归可能会引发一系列性能问题,因此我们是否还有其他办法呢?

递归有个同义词叫迭代,而迭代只需要在一个循环里重复执行一个计算即可,这样就可以避免递归产生的问题。

因此我们只需要把递归方法改造成迭代方法即可,里面的解题思路基本都是一样的,只不过是不通的写法。代码如下:

public static ListNode AddTwoNumbersIteration(ListNode l1, ListNode l2)
{//创建头节点,即第一位计算结果var head = new ListNode(0);//用于迭代节点var current = head;//初始化进位值int carry = 0;//当两个链表节点都不为空并且进位值不等于0,则继续迭代while (l1 != null || l2 != null || carry != 0){//以进位值为初始值定义两节点和变量,var sum = carry;//如果l1节点不为空,则累加其节点值,并且把其下个节点赋值给自身,用于下次迭代if (l1 != null){sum += l1.val;l1 = l1.next;}//如果l2节点不为空,则累加其节点值,并且把其下个节点赋值给自身,用于下次迭代if (l2 != null){sum += l2.val;l2 = l2.next;}//计算进位值carry = sum / 10;//以当前位值,创建下一个节点current.next = new ListNode(sum % 10);//把下个节点赋值给当前迭代节点,继续下次迭代current = current.next;}//返回实际结果链表的头节点return head.next;
}

运行结果如下:

对于这一题核心解题思路是一样,问题在于如何选择方法,递归有递归的好处,迭代有迭代的好处,因此要根据自己实际情况进行选择。

下面对递归和迭代做个点单对比:

递归:代码更简洁直观,逻辑更接近问题的自然描述易于理解;但是递归会消耗更多内存,深度递归可能会导致栈溢出。

迭代:节省内存,性能会更好;但是代码更难理解。

题目到这里就做完了,但是不知道有没有人会有这样的疑惑?

在迭代法中,链表head是一个引用类型,并且被赋值给了链表current,而链表current在迭代中不停的被current.next覆盖,那么为什么这个覆盖过程没有影响到链表head?导致head为整个链表的最后一个节点?最后返回的head.next还是正确的答案?

你知道为什么吗?

测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。 https://gitee.com/hugogoos/Planner

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

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

相关文章

pytesseract实现识别pdf文件并将内容写入word文档中

步骤一:先安装tesseract-ocr-w64-setup-5.4.0.20240606 (安装记得语言包只安装需要的即可) 步骤二:将安装目录添加到系统环境变量中 (网上很多这一步之后就说可以运行程序了其实不然,一直报错没有添加到环境变量中) 步骤三:第四步:可以正常运行啦 =================…

消息中间件ms

消息中间件rabbitmq如何保证数据不丢失 MQ高级搜消息可靠性 常用于mq重复消费问题解决 搜消费者重复消息问题延迟队列有了解过吗?(私信交换机) 搜延迟消息如果有100w的消息堆积到mq怎么办(消息堆积)高可用机制了解过吗

9种最高频的架构模式

这9种最高频的架构模式了解一下,什么样的业务适合事件驱动,什么样的业务适合ETL,什么类型的服务依赖streaming,分别有什么样的特征最好事前准备,我的专栏会分析每种架构的方法论和面试注意事项,感兴趣的可以关注

gadget驱动框架(一)

之前在linux移植udc驱动的时候,没有深入的理解整个gadget驱动框架,现在重新再屡屡gadget驱动,以便后期再次学习。本系列的文章以虚拟串口进行分析,相关源码均是基于linux4.19.123。 gadget驱动框架 gadget源码主要在:drivers/usb/gadget,以虚拟串口为例,对源文件做简单说…

Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model(2024,8)

Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model(2024,8) Paper TODO: 目前没有开源代码,实时关注一下official code,Meta的工作基本开源的.本文给出了一种新的T2I的方法. lucidrains的代码本质是将LLM的transformer和图像中的diffusion结…

代码整洁之道--读书笔记(1)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

Towards Robust Blind Face Restoration with Codebook Lookup Transformer(NeurIPS 2022) | Codeformer

Towards Robust Blind Face Restoration with Codebook Lookup Transformer(NeurIPS 2022) 这篇论文试图解决的是盲目面部恢复(blind face restoration)问题,这是一个高度不确定的任务,通常需要辅助指导来改善从低质量(LQ)输入到高质量(HQ)输出的映射,或者补充输入中丢…

[MySQL]B+树能存储多少数据

MySQL中一个B+树能存储多少数据MySQL中InnoDB页的大小默认是16k。也可以自己进行设置。(计算机在存储数据的时候,最小存储单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如 XFS/EXT4)最小单元是块,一个块的大小是 4KB。 InnoDB 引擎存储数据的时候,是以页为单位的…

基于 GoFrame 框架的 Go 项目打包成镜像,并上传至 Harbor 镜像库

本文通过将一个简单的 gf 项目推送到 harbor,简单介绍了整个流程和过程中用到的命令。〇、前言 在云服务时代最流行的部署方式就是容器部署,这也是最推荐的部署方式。 对于 GoFrame 框架就不多介绍了,直接来初始化一个 demo,备用。 // 初始化一个项目:gf-demo gf init gf-…

ChatOn安卓版(智能AI聊天机器人) v1.48.435-476 高级版

概述 ChatOn 构建于ChatGPT和GPT-4o之上,为用户提供市场上最优秀的中文AI聊天机器人。AI聊天机器人能够达到一个全新水平的仿人类互动:当你为某一场正式会议准备演讲,苦思动人的措辞,或寻求写作方面的帮助时,这款智能机器人和AI助手都会统统帮你搞定。 软件功能 1、AI 写…

JPEG格式研究——(2)JPEG文件格式

JPEG文件除了图像数据之外,还保存了与图片相关的各种信息,这些信息通过不同类型的TAG存储在文件中。 TAG JPEG通过TAG标记压缩书记之外的信息。所有的TAG都包含一个TAG类型,TAG类型大小为两个字节,位于一个TAG的最前面。TAG类型的第一个字节一定为0xFF 以下是部分常见的TAG…

【python】一篇搞懂多解释器与虚拟环境

一.同一PC上,python同时支持多个版本的解释器共存1.1:安装不同版本python解释器(参考百度资料)# python安装后,解释器目录介绍 C:\python39- python.exe [解释器]-Scripts- pip.exe- pip3.exe- pip3.9.exe- Lib- re.py- random.py 内置模块- site-packages- requests …