https://leetcode.com/problems/add-two-numbers/
ListNode안의 value가 모두 음의 정수가 아니고 비어있지 않은 ListNode가 두 개 주어진다. 두개의 ListNode의 각 자리수를 합하여 더한 수를 뒤집어 출력하는 문제이다.
/**
* 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 객체 answer, node 두개를 생성하고 node에 answer객체를 복사한다.(shallow copy)
ListNode answer = new ListNode();
ListNode node = answer;
반복문을 사용하여 노드가 비어있지 않다면 value값을 꺼내 더하였다.
이 때 합이 10을 넘는 경우는 다음 노드의 숫자의 합에 더해주어야하기 때문에
10으로 나눈 몫을 carry로, 10을 나눈 나머지 값을 그 자리의 수로 사용하였다.
그 다음 새로운 노드(ListNode temp)를 만들어 노드의 value에는 자리의 수를 합한 값을 넣고 처음만든 ListNode인 node의 next에 temp를 넣는다.
그 다음 해당 node에 node.next를 넣는다.
이유 :
위의 과정을 두개의 노드 값이 빌 때 까지 반복한 후 올림 값 (carry) 가 0이상이면 새 노드를(temp) 생성하고 temp값을 넣어 해당 노드를 node의 next에 넣어준다.
위 과정을 완료한 후 answer와 node의 참조값이 동일하므로 answer의 next를 return 한다.
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode answer = new ListNode();
ListNode node = answer;
int carry = 0;
while(l1 != null || l2 != null) {
int sum = carry;
if(l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if(l2 != null) {
sum += l2.val;
l2 = l2.next;
}
carry = sum / 10;
sum %= 10;
ListNode temp = new ListNode(sum);
node.next = temp;
node = node.next;
}
if(carry > 0) {
ListNode temp = new ListNode(carry);
node.next = temp;
}
return answer.next;
}