1、题目描述
给出两个非空
的链表
用来表示两个非负的整数。其中,它们各自的位数是按照逆序
的方式存储的,并且它们的每个节点只能存储一位
数字。
如果,我们将这两个数相加
起来,则会返回一个新的链表
来表示它们的和
。
示例:
js
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2、解题思路
这是一个链表操作的题目,我们可以遍历两个链表,将每个节点依次相加
。得到相加的结果之后,将个位数作为当前位的结果,如有十位,就将十位进到下一次进行相加,这样就得出的最后的结果。
3、代码实现
js
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
const l3 = new ListNode(0) // 用来保存结果的链表
let p1 = l1 // 定义两个指针,来遍历链表
let p2 = l2
let p3 = l3 // 定义两个指针,指向结果链表
let carry = 0 // 记录每次相加之后的进位的值
while(p1 || p2) {
const v1 = p1 ? p1.val : 0
const v2 = p2 ? p2.val : 0
const val = v1 + v2 + carry //
carry = Math.floor(val / 10) // 计算进位的值
p3.next = new ListNode(val % 10) // 将个位的值作为当前位的结果
if(p1) p1 = p1.next // 将指针指向下一个节点
if(p2) p2 = p2.next
p3 = p3.next
}
// 如果最后还有进位的值,直接放在结果链表
if (carry) {
p3.next = new ListNode(carry)
}
return l3.next
}
解释:
输入:
js
l1: 2 -> 4 -> 3 -> null (表示数字342)
l2: 5 -> 6 -> 4 -> null (表示数字465)
执行过程:
1、初始化
- l3: 0 -> null
- carry = 0
2、第一次循环(个位):
- v1 = 2, v2 = 5
- val = 2 + 5 + 0 = 7
- carry = 7 // 10 = 0
- l3: 0 -> 7 -> null
- 移动指针:p1指向4,p2指向6
3、第二次循环(十位):
- v1 = 4, v2 = 6
- val = 4 + 6 + 0 = 10
- carry = 10 // 10 = 1
- l3: 0 -> 7 -> 0 -> null (因为 10 % 10 = 0)
- 移动指针:p1指向3,p2指向4
4、第三次循环(百位)
- v1 = 3, v2 = 4
- val = 3 + 4 + 1 = 8 (注意这里加了进位1)
- carry = 8 // 10 = 0
- l3: 0 -> 7 -> 0 -> 8 -> null
- 移动指针: p1和p2均为null,退出循环
5、最终结果;
- 返回l3.next:7 -> 0 -> 8 -> null (表示807)
- 创建一个虚拟头节点
l3
(值为0
),最终返回l3.next
。 - 用
carry
记录进位值。 - 当链表长度不一致时,短链表用
0
补位。 - 循环结束后如果还有进位,需要额外添加节点。
假设有两个链表:
js
- l1: 2->4->3(表示数字342)
- l2: 5->6->4(表示数字465)
执行过程图示:
js
初始化:
l3:0 -> null
carry = 0
Step 1(个位相加):
2 + 5 + 0 = 7
carry = 0
l3: 0 -> 7 -> null
Step 2(十位相加):
4 + 6 + 0 = 10
carry = 1
l3: 0 -> 7 -> 0 -> null
Step 3(百位相加):
3 + 4 + 1 = 8
carry = 0
l3: 0 -> 7 -> 0 -> 8 -> null
最终结果:7 -> 0 -> 8 (表示807)
js
- l1: 2->4->3(表示数字342)
- l2: 5->6->4(表示数字465)
js
l1: 2 -> 4 -> 3 -> null
l2: 5 -> 6 -> 4 -> null
l3: 0 -> null
第一次循环后:
l3: 0 -> 7 -> null
第二次循环后:
l3: 0 -> 7 -> 0 -> null
第三次循环后:
l3: 0 -> 7 -> 0 -> 8 -> null
返回 l3.next: 7 -> 0 -> 8 -> null
4、提交结果
