Leetcode Java Add Two Numbers II
업데이트:
문제
코드
/**
* 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) {
l1 = this.reverseList(l1);
l2 = this.reverseList(l2);
ListNode result = null;
ListNode temp = result;
int carry = 0;
while (l1 != null && l2 != null) {
int sum = carry + l1.val + l2.val;
carry = sum / 10;
ListNode listNode = new ListNode(sum % 10);
if (result == null) {
result = listNode;
temp = result;
} else {
temp.next = listNode;
temp = temp.next;
}
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
int sum = carry + l1.val;
carry = sum / 10;
temp.next = new ListNode(sum % 10);
l1 = l1.next;
temp = temp.next;
}
while (l2 != null) {
int sum = carry + l2.val;
carry = sum / 10;
temp.next = new ListNode(sum % 10);
l2 = l2.next;
temp = temp.next;
}
while (carry != 0) {
temp.next = new ListNode(carry % 10);
carry /= 10;
temp = temp.next;
}
return this.reverseList(result);
}
private ListNode reverseList(ListNode ls) {
ListNode reverse = new ListNode(ls.val);
while (ls.next != null) {
ls = ls.next;
reverse = new ListNode(ls.val, reverse);
}
return reverse;
}
}
결과
설명
-
숫자를 ListNode로 만든 l1과 l2를 이용하여 합친 값으로 새 ListNode를 만들어 반환하는 문제이다.
- ListNode의 값들을 역순으로 전환하기 위한 reverseList(ListNode ls) 메서드를 정의한다.
- ls의 val 값으로 ListNode를 만들어서 reverse에 정의하고, ls의 next가 null이 아닐 때 까지 반복하여 reverse에 ls 내 val 값들을 역순으로 만들어준다.
- 반복이 완료되면 reverse를 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- l1과 l2에 2번에서 정의한 reverseList(ListNode ls) 메서드를 이용하여 값들을 역순으로 만들어준다.
- result는 결과를 넣을 변수로, null로 초기화한다.
- temp는 결과를 엮어줄 임시 변수로, result로 초기화한다.
- carry는 숫자의 합이 10 이상일 경우, 10 자릿수를 넣어줄 변수이다.
- l1과 l2가 null이 아닐 때 까지 반복하여 아래를 수행한다.
- sum에 l1과 l2의 val 값과 carry의 합을 넣어준다.
- carry에 10을 나눈 값을 carry에 다시 넣어준다.
- listNode에 sum의 1 자릿수를 이용하여 새 ListNode를 만들어 넣어준다.
- result가 null인 경우 첫 값이므로, result에 listNode와 temp에 result를 넣어준다.
- result가 null이 아니면, temp의 next에 ListNode를 temp에 temp의 next ListNode를 넣어준다.
- l1에 l1의 next ListNode를 l2에 l2의 next ListNode를 넣어준다.
- l1, l2 순으로 각 ListNode가 null이 아닐 때 까지 반복하여 아래를 수행한다.
- sum에 carry와 val 값을 더해준다.
- carry에 10을 나눈 값을 carry에 다시 넣어준다.
- temp의 next에 sum의 1 자릿수를 이용하여 새 ListNode를 만들어 넣어준다.
- l1에 l1의 next ListNode를, temp에 temp의 next ListNode를 넣어준다.
- carry에 값이 남아있는 경우, 아래를 수행한다.
- temp의 next ListNode에 carry의 1 자릿수를 이용하여 새 ListNode를 만들어 넣어준다.
- carry에 10을 나눈 값을 carry에 다시 넣어준다.
- temp에 temp의 next ListNode를 넣어준다.
- 역순의 값을 더해 이어준 result를 2번의 reverseList(ListNode ls) 메서드를 이용하여 다시 원래대로 돌려서 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기