카테고리 없음

[LeetCode] Add Two Numbers

5묘 2023. 9. 27. 18:16

https://leetcode.com/problems/add-two-numbers/editorial/

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문제를 주어진 시간 내에 못 풀었다..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