[LeetCode] 2. Add Two Numbers

lkdcode·2023년 8월 29일
0

Algorithm

목록 보기
18/47
post-thumbnail

2. Add Two Numbers


# 문제 분석

두 개의 링크드 리스트가 주어지고 순서대로 더해서 리턴하는 문제.
노드의 값은 0~9고 두 노드를 더해서 10이 넘어가면 다음 덧셈에 값을 올려주어야 한다.


# 풀이 과정

결과를 리턴할 ListNode result; 를 하나 선언한다.
반복문을 돌면서 노드를 덮어씌우기 때문에 원본을 그대로 사용하면 안 된다
얕은 복사를 통해 원본을 하나 복사한다. ListNode copy = result

덧셈을 할 변수 int sum 선언.

매개변수로 주어지는 리스트1리스트2null 이 아니거나 sum 의 값이 0 초과라면 반복문을 계속 돈다.

리스트1null 이 아니라면 sum 에 값을 더해주고 다음 노드로 변경
리스트2null 이 아니라면 sum 에 값을 더해주고 다음 노드로 변경

sum%, / 연산을 통해 덧셈을 해주고
copy.nextnew ListNode 를 하여 sumval 로 갖게 선언해준다.
copy 도 역시 다음 노드로 변경해준다.

이렇게 연결된 노드의 시작은 result 다음 노드이기 때문에
result.next 를 리턴하면 된다.


# 나의 생각

원본을 복사하지 않고 문제를 풀면서 왜 해결이 안 됐는지 이해하지 못 했다.
원본 그대로 사용하는 로직의 결과와 복사본을 사용하는 로직의 결과의 차이를 몰랐던 것.

원본을 그대로 사용하는 로직은 31번 라인에서 원본이 덮어쓰기가 되기 때문에
초기화가 된다.
로직은 같다고 볼 수도 있지만 이런 사소한 차이가 결과를 완전히 뒤바꾸게 된다.

위의 코드는 원본을 그대로 사용하는 로직이다. (물론 오답)


# 코드

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode result = new ListNode();
        ListNode copy = result;
        int sum = 0;

        while (l1 != null || l2 != null || sum > 0) {
           
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }

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

            copy.next = new ListNode(sum % 10);
            sum /= 10;
            copy = copy.next;
        }

        return result.next;
    }

profile
되면 한다

0개의 댓글