πŸ“ μ•Œκ³ λ¦¬μ¦˜/자료ꡬ쑰

[LeetCode] 445. add Two Numbers 2 (해석, Java 풀이)

점이 2023. 7. 17. 22:04
λ°˜μ‘ν˜•

문제

https://leetcode.com/problems/add-two-numbers-ii/description/

μ£Όμ–΄μ§„ λ‘κ°œμ˜ λΉ„μ–΄μžˆμ§€ μ•Šμ€ linked listλŠ” 각각 μŒμˆ˜κ°€ μ•„λ‹Œ μ •μˆ˜λ‘œ μ΄λ£¨μ–΄μ Έμžˆλ‹€. κ°€μž₯ μ€‘μš”ν•œ μˆ«μžκ°€ 첫번째둜 였며, κ·Έλ“€μ˜ λ…Έλ“œ 각각은 ν•œμžλ¦¬ 수λ₯Ό ν¬ν•¨ν•œλ‹€. 두 숫자λ₯Ό λ”ν•œ 합을 linked list ν˜•νƒœλ‘œ λ°˜ν™˜ν•˜λΌ. 

두 μˆ«μžλŠ” 0일 경우λ₯Ό μ œμ™Έν•˜κ³ , μ•žμžλ¦¬κ°€ 0으둜 λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€.

 

풀이

Stack을 μ‚¬μš©ν•œ 풀이

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ArrayDeque<Integer> st1 = new ArrayDeque<>();
    ArrayDeque<Integer> st2 = new ArrayDeque<>();

    while (l1 != null) {
        st1.push(l1.val);
        l1 = l1.next;
    }
    while (l2 != null) {
        st2.push(l2.val);
        l2 = l2.next;
    }

    ListNode result = null;
    int carry = 0;
    while (!st1.isEmpty() || !st2.isEmpty() || carry > 0) {
        int v1 = (!st1.isEmpty()) ? st1.pop() : 0;
        int v2 = (!st2.isEmpty()) ? st2.pop() : 0;

        int sum = v1 + v2 + carry;

        ListNode newNode = new ListNode(sum % 10);
        newNode.next = result;
        result = newNode;

        carry = sum / 10;
    }

    return result;
}

λŒ€μ²΄ν•  ArrayDequeλ₯Ό μŠ€νƒ ν˜•νƒœλ‘œ μ‚¬μš© - Stack λŒ€μ‹  ArrayDequeλ₯Ό μ‚¬μš©ν•˜λŠ” 이유 

λ˜λŠ” ListNodeλ₯Ό λ°˜λŒ€λ‘œ λ’€μ§‘μ–΄, λ™μΌν•˜κ²Œ ν•˜λ‚˜μ”© λ”ν•˜λŠ” 방법도 μžˆκ² λ‹€.

 

μ‹œκ°„ λ³΅μž‘λ„: O(max(n+m)), 곡간 λ³΅μž‘λ„: O(n+m)

https://github.com/jeongum/java-algorithm/blob/master/stack/LeetCode_445_AddTwoNumbers.java

 

λ°˜μ‘ν˜•