https://leetcode.com/problems/add-two-numbers/editorial/
문제를 주어진 시간 내에 못 풀었다..ListNode() 라는 새로운 class의 형태를 도저히 문제에 어떻게 적용해야 할지 모르겠었다.
결국 그래서 해설을 봤는데, 우선 재귀로 푸는 방법이 하나가 있었다.
더보기
풀이:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let node = null
const carry = arguments[2]
if (l1 || l2) {
const val1 = l1 ? l1.val : 0
const val2 = l2 ? l2.val : 0
const next1 = l1 ? l1.next : null
const next2 = l2 ? l2.next : null
const val = carry ? val1 + val2 + 1 : val1 + val2
node = new ListNode(val % 10)
node.next = addTwoNumbers(next1, next2, val >= 10)
} else if (carry) {
node = new ListNode(1)
node.next = null
}
return node
};
이 방법의 경우 재귀(recursive)를 이용해 node.next의 값을 계속 node 값으로 활용할 수 있다.(90ms, 48.58MB)
또, 재귀로 풀지 않을 경우 다음의 해설을 참고할 수 있다.
더보기
var addTwoNumbers = function(l1, l2) {
let sum = 0;
let current = new ListNode(0);
let result = current;
while (l1 || l2) {
if (l1) {
sum += l1.val;
l1 = l1.next;
}
if (l2) {
sum += l2.val;
l2 = l2.next;
}
current.next = new ListNode(sum % 10);
current = current.next;
sum = sum > 9 ? 1: 0;
}
// 0은 falsy 값이므로.
if (sum) {
current.next = new ListNode(sum);
}
return result.next;
};
이 방법은 current라는 변수를 이용해, 더할 값이 남아있다면 current = current.next로 current에 계속 더해지도록 하고, 만약 더할 값이 남아있지 않은데 sum의 자릿수가 남았다면 해당하는 자릿수만큼을 하나 더하여 current node를 완성한다.
81ms, 47.71MB