LeetCode题集-2 - 两数相加

这个题目是什么意思呢?简单来说就是把两个链表平铺开,头节点对齐,然后从头开始相同的节点相加,满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
LeetCode题集-2 - 两数相加的更多相关文章
- 【LeetCode题解】2_两数相加
目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...
- Leetcode(2)两数相加
Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- Leetcode题库——1.两数之和
@author: ZZQ @software: PyCharm @file: addTwoNumbers.py @time: 2018/9/18 10:35 要求:给定两个非空链表来表示两个非负整数. ...
- LeetCode 0、《两数相加》
一.给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...
- LeetCode题解002:两数相加
两数相加 题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- Leetcode(2)-两数相加(包含链表操作的注意事项)
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- 【算法题目】Leetcode算法题思路:两数相加
在LeetCode上刷了一题比较基础的算法题,一开始也能解出来,不过在解题过程中用了比较多的if判断,看起来代码比较差,经过思考和改进把原来的算法优化了. 题目: 给出两个 非空 的链表用来表示两个非 ...
- leetcode刷题第二天<两数相加>
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- 【LeetCode每日一题 Day 2】2. 两数相加
大家好,我是编程熊,今天是LeetCode每日一题的第二天,一起学习的是LeetCode第二题<两数相加>. 题意 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 ...
随机推荐
- 利用SpringBoot+rabbitmq 实现邮件异步发送,保证100%投递成功
在之前的文章中,我们详细介绍了 SpringBoot 整合 mail 实现各类邮件的自动推送服务. 但是这类服务通常不稳定,当出现网络异常的时候,会导致邮件推送失败. 本篇文章将介绍另一种高可靠的服务 ...
- 实用!一键生成数据库文档的神器,支持MySQL/SqlServer/Oracle多种数据库
Screw(螺丝钉)是一款简洁好用的数据库表结构文档生成工具,它的特点是:简洁.轻量.设计良好.多数据库支持.多种格式文档.灵活扩展以及支持自定义模板,对于有经常要进行数据库设计.评审.文档整理等需求 ...
- Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 useHead 函数概述 useHead是一个用于在 Nuxt 应用中自定义页面头部属性的函数.它由Unhead库提供支持,允许开发者以编 ...
- Day 11 - 模拟考
WTP 的大洗牌 题目描述 \(\text{input1}\) 3 1 1 1 1 2 3 \(\text{output1}\) 10 0 数据范围 shuffle.zip 第一题 题目描述 输入格式 ...
- 记录荒废了三年的四年.net开发的第二次面试(进复试了)
这次面试的是小公司,深圳计通智能,面试分为初试和复试.使用腾讯视频会议完成.相比与上次面试,这次有所进步,进复试了.当然,这可能也与面试风格有关.这次面试着重与项目经历和技术,因此回答比较顺畅. 这一 ...
- mysql数据库无法录入汉字问题
1.插入数据出现错误 show full columns from 表名;//查看数据表列编码 2. alter table 表名 change 列名 列名 varchar(自己设置) charact ...
- Segment-anything学习到微调系列_SAM初步了解
Segment-anything学习到微调系列_SAM初步了解 前言 本系列文章是博主在工作中使用SAM模型时的学习笔记,包含三部分: SAM初步理解,简单介绍模型框架,不涉及细节和代码 SAM细节理 ...
- GeoScene Enterprise 3.1 临时许可更新
Portal许可更新 portal 的许可更新很简单,直接打开Portal在线更新就好了 平台管理 -> 许可管理 -> 附加许可 -> 导入许可 -> 选择文件(选择授权的j ...
- 【微信小程序】01 入门
官方开发文档: https://developers.weixin.qq.com/miniprogram/dev/devtools/devtools.html 需要去微信公众平台注册开发账号: mp. ...
- 【Git】03 撤销 & 版本回退
回退分为三种情况,每种情况对应了我们文件的存储区域 工作区 | 暂存区 | 版本区(当前分支) 1.文件可能存放在工作区,没有被Git追踪[红色标记状态] 2.文件可能已经添加到暂存区,没有被Git提 ...