持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
1.题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
2.思路
本题需要我们将两条链表上面的数字进行相加并将结果存储至第三条链表的对应位置上。我们可以通过遍历两条链表,并在遍历的同时生成第三条链表,然后将相加的结果设置为第三条链表的值就行了,但是在这过程中我们还需要注意到链表相加的结果可能会大于10,而第三条链表上的的节点是不能存储两位数的,所以我们要进行进位,这就还需要一个额外的变量来存储进位的值。
我们首先创建一个新的链表,然后准备一个指针指向新的链表的头节点,还有一个进位变量,然后就开始循环,直到两条链表都遍历完了,我们才结束循环。首先我们计算p1,p2链表当前节点以及进位变量的和,如果大于等于10则将进位变量设为1并将余数设为第三条链表的值,如果小于10则直接设置,并将进位变量重置为0。然后将三条链表都指向自己的下一位。当循环结束时,我们还需要判断当前进位是否为1,如果为1的话还需要给第三条链表增加一个新的节点。
var addTwoNumbers = function(l1, l2) {
let ten = 0
let l3 = new ListNode(0)
let p3 = l3
while(l1||l2){
const total = null
let num = (l1?l1.val:0)+(l2?l2.val:0)+ten
ten = Math.floor(num/10)
p3.next = new ListNode(num%10)
if(l1)l1 = l1.next
if(l2)l2 = l2.next
p3 = p3.next
}
if(ten){
p3.next = new ListNode(1)
}
return l3.next
};