[LeetCode-2] 两数相加

发布于个人公众号,打开微信,搜索MelodyJerry即可

2. 两数相加

难度中等通过率40.51%
(909,450/2,244,760)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 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]

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

题解

这题目有几个关键点:

  1. 并没说明两个链表的长度是一样长的;
  2. 每位数字都是按照 逆序 的方式存储的
  3. 每个节点只能存储 一位 数字
  4. 以相同形式返回一个表示和的链表
  5. 列表表示的数字不含前导零

如上述,只需要将链表长度统一后再考虑是否进位即可:

  1. 长链的长度为m,短链的长度为n,仅需要将短链结尾后的m-n位置为0。换句话说,即若当前节点!=null,则取节点的val;若==null,则取0
  2. 维护进位数,该进位数①用以记录当前位置两数求和后是否进位,即求和后的数的十位数,要么为0,要么为1;②该进位数需要参与在下一位置的求和计算中,即要么+0,要么+1
  3. 计算完后,更新结果链表answer,且需要后移链表answerl1l2的指针。
  4. 全部计算完成后,返回节点answer.next

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

上述代码有两个关键点:

  1. Q:为什么返回的是answer.next,而不是answer
  • A:①在创建链表answer时,事先是不能知道要创建多长的链表;②在每一个位置的计算后都是new一个ListNode sumNode,并都是answer.next指向sumNode;③所以上述看来,链表answer的头节点是null,头节点的.next才是预期结果的开始。

【注意点】

对于链表问题,返回结果为头结点headhead.next时,通常需要先初始化一个预指针cur,目的在于链表初始化时无可用节点值,而且链表构造过程需要移动指针,进而会导致头指针丢失、链表断裂,无法返回正确的链表。

  1. 为什么while中要进行 carryNumber!=0 的判断?
  • 看到代码末尾的注释中的测试用例后,应该能够理解,这里画个图,更好理解:

carryNumber!=0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢前端的后端MelodyJerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值