CodingTest/LeetCode

[LeetCode] 2. Add Two Numbers, Medium

뜸부깅 2025. 3. 31. 18:35
반응형

1. 문제

  • 2개의 단일 연결 리스트가 주어질 때, 같은 인덱스를 가지는 각 노드를 합하여 1개의 단일 연결 리스트를 반환하라.

2. 해결

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
    const dummy = new ListNode(0)
    let dummyP = dummy;

    let carry = 0;

    while(l1 || l2) {
        let sum = 0;

        if(l1) {
            sum+=l1.val;
            l1 = l1.next;    
        }

        if(l2) {
            sum+=l2.val;
            l2 = l2.next;    
        }

        sum += carry;
        carry = Math.floor(sum/10);
        sum %= 10;
        dummyP.next = new ListNode(sum);
        dummyP = dummyP.next;
    }

    if(carry !== 0) dummyP.next = new ListNode(carry);

    return dummy.next;
    // let p1 = l1, p2 = l2;
    
    // let numStr1 ='', numStr2  = '';
    
    // while(p1) {
    //     numStr1 += p1.val.toString();
    //     p1 = p1.next;
    // }
    
    // while(p2) {
    //     numStr2 += p2.val.toString();
    //     p2 = p2.next;
    // }
    
    // const dummy = new ListNode(0);
    // let dummyP = dummy;
    
    // const total = String(BigInt(numStr1.split('').reverse().join('')) + BigInt(numStr2.split('').reverse().join('')))

    // total.split('').reverse().forEach(num => {
    //     const node = new ListNode(Number(num));
    //     dummyP.next = node;
    //     dummyP = node;
    // })
    
    
    // return dummy.next;
};
  • 첫 번째 풀이는 주석처리 한 부분이다. 
  • 두 연결 리스트를 탐색하면서, 정수를 추출하고 더하고 뒤집어 각 자리수 별로 노드로 추가하는 것. 성능이 좋지 않았다.
  • 다른 사람들 풀이를 참고했을 때, carry를 활용해서 sum을 계산하고 노드를 추가하는 과정을 거친다.