두 개의 비어있지 않은 연결 리스트가 주어집니다. 각 연결 리스트는 음이 아닌 정수 하나를 나타내며, 각 노드에는 한 자리 숫자(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은 예외)
저는 리스트를 순차적으로 진행하면서,
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이 되게 설정했습니다.
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;
}
}