LeetCode Add Two Numbers [JAVA] - 23년 8월 19일

Denia·2023년 8월 19일
0

코딩테스트 준비

목록 보기
195/201

처음에는 단순한 더하기 문제인줄 알고 이게 왜 Medium이지? 했었다. 그런데 자료구조 - 연결리스트에 대한 문제였고, 해당 자료구조에 대해서 이해도가 부족하다면 많이 헷갈릴 수 있겠다 싶었다. -> 헷갈린 사람 == 나


처음 풀이

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode answer = new ListNode(-1);
        ListNode answerStart = answer;

        int nextDigitNum = 0;

        while (l1 != null || l2 != null || nextDigitNum != 0) {
            int curDigitNum = 0;
            int l1Val = 0;
            int l2Val = 0;

            if (l1 != null) {
                l1Val = l1.val;
                l1 = l1.next;
            }

            if (l2 != null) {
                l2Val = l2.val;
                l2 = l2.next;
            }

            curDigitNum += (l1Val + l2Val + nextDigitNum);

            nextDigitNum = curDigitNum / 10;
            curDigitNum = curDigitNum % 10;

            if (answer.val == -1) {
                answer.val = curDigitNum;
                continue;
            }

            answer.next = new ListNode(curDigitNum);
            answer = answer.next;
        }

        return answerStart;
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

C하면서 포인터를 그렇게 했지만, 그렇게나 친숙한건 아니었나보다.
DummyHaed 라는 생각을 전혀 못해서 어쩔 수 없이 반복문안에서 if문을 여러번 처리했고 그러다 보니 속도가 늦게 나왔다.

정답 확인 후 최적화


class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(-1);
        ListNode tail = dummyHead;

        int nextDigitNum = 0;

        while (l1 != null || l2 != null || nextDigitNum != 0) {
            int curDigitNum = 0;
            int l1Val = 0;
            int l2Val = 0;

            if (l1 != null) {
                l1Val = l1.val;
                l1 = l1.next;
            }

            if (l2 != null) {
                l2Val = l2.val;
                l2 = l2.next;
            }

            curDigitNum += (l1Val + l2Val + nextDigitNum);

            nextDigitNum = curDigitNum / 10;
            curDigitNum = curDigitNum % 10;

            tail.next = new ListNode(curDigitNum);
            tail = tail.next;
        }

        return dummyHead.next;
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}


dummyHead를 사용하는 것으로 내부에서 현재 노드가 시작 노드인지 아닌지 판단하는 로직을 삭제했더니 시간이 빨라졌다.

profile
HW -> FW -> Web

0개의 댓글