两数之和

本文最后更新于:2024年5月30日 早上

算法思路

由于从加法从最后节点开始运算,所以我们可以用栈存,然后出栈做加法,生成节点就可以了。

数组转链表

1
2
3
4
5
6
7
8
9
10
11
12
13
/** arr to reveser Link Node */
const arrTransToLink = (arr) => {
let ans = null;
let i = 0;
while (i < arr.length) {
let curNode = new ListNode(arr[i]);
curNode.next = ans;
ans = curNode;
i++;
}
// return arrTransToLink([1,2,3]) 1->2->3
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/

const transToArrAndRevert = (link) => {
const arr = [];

while (link) {
arr.push(Number(link.val));
link = link.next;
}

return arr.reverse();
};

const addZero = (arr, len) => {
while (len) {
arr.push(0);
len--;
}
};

/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function (l1, l2) {
// 反转两个链表
const linkArr1 = transToArrAndRevert(l1);
const linkArr2 = transToArrAndRevert(l2);

// 补零

const len = linkArr1.length - linkArr2.length;

if (len > 0) {
addZero(linkArr2, len);
} else if (len < 0) {
addZero(linkArr1, Math.abs(len));
}

let step = 0;
let res = [];

for (let i = 0; i < linkArr1.length; i++) {
const sum = linkArr1[i] + linkArr2[i] + step;

if (sum > 9) {
res.unshift(sum - 10);
step = 1;
} else {
res.unshift(sum);
step = 0;
}
}
if (step === 1) {
res.unshift(1);
}

// 创建一个链表

let header = new ListNode(res[0]);
let p = header;
let l = 1;

while (l < res.length) {
p.next = new ListNode(res[l]);
p = p.next;
l++;
}

return header;
};

两数之和
http://example.com/算法与数据结构/链表/两数之和/
作者
chen heng cheng
发布于
2022年1月11日
许可协议