Add Two Numbers

devK08·2일 전

Algorithm

목록 보기
7/7

1.문제 분석


문제

두 개의 비어있지 않은 연결 리스트가 주어집니다. 각 연결 리스트는 음이 아닌 정수 하나를 나타내며, 각 노드에는 한 자리 숫자(0~9) 가 들어 있습니다. 숫자들은 역순(reverse order) 으로 저장되어 있습니다.
즉, 연결 리스트의 첫 번째 노드가 일의 자리, 다음 노드가 십의 자리…를 의미합니다.

이 두 수를 더한 결과를 연결 리스트 형태로 반환하세요.

단, 두 수는 0 자체를 제외하고는 leading zero(앞자리가 0인 형태) 를 가지지 않는다고 가정합니다.


입/출력 예시

예시 1

입력: l1 = [2,4,3], l2 = [5,6,4]

출력: [7,0,8]

설명: [2,4,3]은 342, [5,6,4]는 465를 의미하므로
342 + 465 = 807 → 역순으로 [7,0,8]

예시 2

입력: l1 = [0], l2 = [0]

출력: [0]

예시 3

입력: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

출력: [8,9,9,9,0,0,0,1]


제약 조건

각 연결 리스트의 노드 개수는 1 이상 100 이하

0 <= Node.val <= 9

연결 리스트는 leading zero 없이 숫자를 표현함 (단, 숫자 0은 예외)


2. 나의 생각


저는 리스트를 순차적으로 진행하면서,
l1에 있는 요소 n과 l2에 있는 요소 n을 더하는 식으로 구현하려했습니다.
하지만, 여기에서 carry값, 즉 올림 값이 있으므로 l1 요소 n과 l2 요소 n 그리고 carry값을 더하여 해당 값에 n의 자리 value를 정합니다.
또한, 올림이 발생하면 carry값을 1로 설정하도록 하였습니다.
그리고 l1이나 l2에서 더 이상 값이 나오지 않는다면 next를 하지 못하게 하여, 계속 l1이나 l2값을 null로 유지했습니다.
또한, l1 이나 l2 값이 null이면 value를 자동으로 0이 되게 설정했습니다.


3. 코드

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(); // 초기 값 ListNode
        ListNode cur = dummy; // 실제 값들을 넣을 ListNode
        int carry = 0;
        while(l1 != null || l2 != null || carry != 0) {
            int n1 = (l1 == null) ? 0 : l1.val;
            int n2 = (l2 == null) ? 0 : l2.val;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            sum %= 10;

            ListNode node = new ListNode(sum);
            cur.next = node;

            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;

            cur = cur.next;
        }

        return dummy.next;
    }
}
profile
안녕하세요. 개발자 지망 고등학생입니다.

0개의 댓글