[Leet code] Add Two Numbers (java)

백승호·2021년 3월 24일
0

알고리즘공부

목록 보기
2/6

문제

코드

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode node = new ListNode(0);
        ListNode result = node;
        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;
            }
            node.next = new ListNode(sum % 10); // 1의자리
            sum /= 10; // 10의 자리
            node = node.next; // 1의자리 가지고 다음 노드는 10의자리 연산에사용됨 
        }
        return result.next; // 시작점은 바꼈으니까!
    }
}

해설

서로 다른 2개의 링크드 리스트가 주어지며 각 리스트의 노드에 담긴 0 ~ 9 사이의 숫자를 더한 결과값을 갖는 리스트를 리턴하는문제이다. 핵심은 각 노드의 수를 더하고 자리올림이 발생하는 경우 그 값을 다음 노드들의 연산에 적용해주는것이다.
따라서 캐리값을 담을 변수하나(sum)와 연산결과를 저장할 리스트하나(node), 그리고 답을 리턴하기위해 최초의 노드를 가리키고있는 리스트하나(result), 이렇게 총 3개의 선언이 필요해진다.

반복문을 통해 노드를 돌며 값을 더해 새로운 리스트의 노드들을 이어 만들어줄건데 이 때 종료조건을 잘 생각해보면
l1을 다 봐야하고, l2를 다 봐야하고, 둘다 비어있더라도 이전 연산의 자리올림이 있다면 반영해줘야하고. 이 3가지 조건을 충족해야한다.

반복문의 조건을 챙기고나면 나머지는 나머지연산과 몫연산에 의해 간단하게 해결된다. sum 에 l1, l2값을 더해준 결과 나머지를 갖는 새로운 노드를 node.next에 생성하고, sum은 몫연산 값을 저장한뒤 node = node.next로 옮겨 다음 반복문에서 새로운 노드가 원활하게 생성될 수 있도록한다

참고: https://bcp0109.tistory.com/entry/Add-Two-Numbers-Java

profile
삽질하는 개발자 지망생

0개의 댓글