You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
- Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
- Output: 7 -> 0 -> 8
- Explanation: 342 + 465 = 807.
나의 풀이
1 | /** |
원래 기존 풀이는 200ms인데 좀 줄였다. 연결리스트에 대한 이해가 부족해서 좀 오래 걸렸다.
아래 코드가 굉장히 비효율적이라고 느껴서 위의 코드처럼 다시 만들었는데 그렇게 효율적으로 보이지는 않는다.
나중에 한번 더 다른 방법으로 풀어보고 다른 사람 풀이를 봐야겠다.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// 200ms
var addTwoNumbers = function(l1, l2) {
const toArray = list => {
const arr = [];
const search = node => {
arr.push(node.val)
return node.next != null ? search(node.next) : ''
}
search(list)
return arr;
}
const arr1 = toArray(l1);
const arr2 = toArray(l2);
const large = (arr1.length >= arr2.length ? arr1 : arr2);
const small = (arr1.length >= arr2.length ? arr2 : arr1);
const l = large.length;
const newArr = new Array(l).fill(0);
const splice = idx => {
if(newArr[idx + 1] == null) {
newArr.push(1);
} else {
if(newArr[idx + 1] === 9) {
newArr[idx + 1] = 0;
splice(idx + 1)
} else {
newArr[idx + 1]++;
}
}
}
for(let i = 0; i < l; i++) {
if(small[i] == null) {
const result = newArr[i] + large[i];
if(result >= 10) {
splice(i)
newArr[i] = result - 10;
} else {
newArr[i] = result;
}
} else {
const result = large[i] + small[i];
if(result >= 10 || newArr[i] + result >= 10) {
splice(i)
newArr[i] = newArr[i] + (result - 10);
} else {
newArr[i] = newArr[i] + result;
}
}
}
return newArr;
};