Add Two Numbers

zoovely·2024년 6월 16일
0
post-thumbnail

💬 문제

[문제 링크]

양의 정수를 역순으로 한 자리씩 표기한 연결 리스트 l1, l2
두 값을 더한 결과를 똑같이 역순으로 표현한 새 연결 리스트 반환

Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]

✍️ 나의 풀이

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    let res = new ListNode();
    let move = res;
    let carry = 0;

    while (1) {
        let val1 = l1 ? l1.val : 0;
        let val2 = l2 ? l2.val : 0;
        let sum = val1 + val2 + carry;

        if (sum >= 10) {
            carry = 1;
            move.val = sum - 10;
        } else {
            carry = 0;
            move.val = sum;
        }

        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;

        if (l1 || l2 || carry) {
            move.next = new ListNode();
            move = move.next;
        } else
            break ;
    }

    return res;
};

새로운 연결 리스트의 첫번째 노드를 반환해야 하므로 res에 저장해둔 뒤
실제 움직임은 move를 사용하여 진행
l1, l2가 모두 끝날 때까지 노드를 이동하면서 l1 + l2 값을 새 노드에 저장
더한 값이 10보다 크다면 다음 자리에 올림해주어야 하므로 carry에 저장 후 일의 자리만 저장
두 노드의 다음 노드가 없어도 carry가 존재한다면 새로운 자리수를(노드) 만들어야 함

📌 결과

Accepted
Runtime 88ms (Beats 98.55%)
Memory 54.94MB (Beats 86.40%)

📚 러닝 포인트

문제가 친절하게도 자리 역순으로 되어 있어서 잘 해결해낼 수 있었다. 또한 두 수의 덧셈이기 때문에 carry가 1을 넘지 않아서 다루는데에도 편했다. 다만 내 코드에서는 l1과 l2가 null인지 아닌지 두 번 확인하게 되는데 (next로 넘어가기 이전에) 한번의 if문을 통해 묶었어도 되었을 것 같다. 근데 if문 블럭이 그다지 크지 않으면 개인적으로 삼항 연산자를 사용하는 걸 좋아해서 이번에는 이렇게 작성했다. 사실 sum >= 10 부분도 두번 비교하려다가 이건 아닌 것 같아서 if-else로 바꿨다.

profile
나도 할 수 있을까?

0개의 댓글