出处:LeetCode 算法第2题
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
1 | 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) |
思路
- 本来想自己写解析的,不过后来看LeetCode上面的解析写得真不错,于是就粘贴过来啦
如图,对两数相加方法的可视化: 342 + 465 = 807,每个节点都包含一个数字,并且数字按位逆序存储。
就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表 l1 和 l2 的表头开始相加。由于每位数字都应当处于 0…9 的范围内,我们计算两个数字的和时可能会出现“溢出”。例如,5 + 7 = 12。在这种情况下,我们会将当前位的数值设置为 2,并将进位 carry = 1 带入下一次迭代。进位 carry 必定是 0 或 1,这是因为两个数字相加(考虑到进位)可能出现的最大和为 9 + 9 + 1 = 19。
伪代码如下:
- 将当前节点初始化为返回列表的哑节点。
- 将进位 carry 初始化为 0。
- 将 p 和 q 分别初始化为列表 l1 和 l2 的头部。
- 遍历列表 l1 和 l2,直至到达它们的尾端。
- 将 x 设为节点 p 的值。如果 p 已经到达 l1 的末尾,则将其值设置为 0。
- 将 y 设为节点 q 的值。如果 q 已经到达 l2 的末尾,则将其值设置为 0。
- 设定 sum = x + y + carry。
- 更新进位的值,carry = sum / 10。
- 创建一个数值为 (sum \ bmod 10) 的新节点,并将其设置为当前节点的下一个节点,然后将当前节点前进到下一个节点。
- 同时,将 p 和 q 前进到下一个节点。
- 检查 carry = 1 是否成立,如果成立,则向返回列表追加一个含有数字 1 的新节点。
- 返回哑节点的下一个节点。
注意情况:
测试用例 | 说明 |
---|---|
l1 = [0,1] l2 = [0,1,2] |
当一个列表比另一个列表长时。 |
l1 = [ ] l2 = [0,1] |
当一个列表为空时,即出现空列表。 |
l1 = [9,9] l2 = [1] |
求和运算最后可能出现额外的进位,这一点很容易被遗忘 |
代码
1 | public class Basic02 { |