给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
var addTwoNumbers = function(l1, l2) {
let result = new ListNode(null);
let point = result;
let sum = 0;
let carry = 0;
while(l1 != null || l2 != null){
let a = (l1 != null) ? l1.val : 0;
let b = (l2 != null) ? l2.val : 0;
sum = (a + b + carry) % 10;
// 必须调用这个函数,不然做不了除法
carry = Math.floor((a + b + carry) / 10);
point.next = new ListNode(sum);
point = point.next;
if(l1 != null){
l1 = l1.next;
};
if(l2 != null){
l2 = l2.next;
}
}
if(carry > 0){
point.next = new ListNode(carry);
};
return result.next;
};
解题思路
如题讲述的那样,就是给我们两个链表,而且长度不一定是等长的,让我们进行加操作返回结果。示例1:2->4->3 + 5->6->4 = 7->0->9 ,就是正常每个链表一位一位相加,2+5=7,然后像4+6=10,只要是相加≥10的,我们就需要所谓的进位,所以我们就需要定义一个存储进位数的变量,只能是0或1,每次循环都要及时更新这个进位值,我们还需要定义一个变量存储我们的相加结果,每次循环都将我们的结果取余,没进位的就是结果本身,进位值就是0,有进位的最终结果就是个位数字(例如12取余就是2),进位值为1。定义一个新的链表,将每次的结果存储进去。当不同长度的链表时,将短的链表后面补0,补到跟另一个链表一样长。当最后以为都相加完之后,如果此时还是有进位的话,只需在新链表再向后指一次,将进位值存进去即可。
注意
JavaScript计算除法的方法:
- 1、通过“Math.round(x)”实现除法并四舍五入;
- 2、通过“Math.floor(x)”实现除法并向下舍入;
- 3、通过“Math.ceil(x)”实现除法并向上舍入。