两数相加

发布时间:2022-09-21 作者:yaming042 阅读量:- 本文字数:5.9k 阅读时长 ≈ 5 分钟

原题

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

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

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

两数相加

1
2
3
4
5
6
7
8
9
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807

输入:l1 = [0], l2 = [0]
输出:[0]

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

解法思路:
看了leecode上的一些解题思路,感觉大概思路就和小学的加法竖式一样,个位加个位,十位加十位,大于10就进位;以最大长度的数组长度为标准进行数组遍历,依次对各位进行相加(这里数组短的第n位可能是undefined,相加时得容错),声明一个进位变量carry用来记录进位,那么第n为的值就是 (a[i]+b[i]+carry)%10 ,此时的进位carry就是 parseInt((a[i]+b[i]+carry)/10);当数组遍历完,可能进位还存在,所以此时就需要新增一位来容纳进位。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const addTwoNumber = (a=[], b=[]) => {
let carry = 0,
ret = [],
maxLength = Math.max(a.length, b.length);

for(let i=0;i<maxLength;i++) {
if(undefined !== a[i] || undefined !== b[i]) {
const sum = (a[i] || 0) + (b[i] || 0) + carry;
const value = sum % 10;

ret[i] = value;

carry = parseInt(sum / 10);
}
}

if(ret.length && carry > 0) {
ret[ret.length] = carry;
}

return ret;
};
console.log( addTwoNumber([0], [0]) ); // [0]
console.log( addTwoNumber([9,9,9,9,9,9,9], [9,9,9,9]) ); // [8, 9, 9, 9, 0, 0, 0, 1]

注意:

  • 需要对入参的合法性进行判断
  • 函数里面需要做边界,取值语法判断,目前并没有做