두 개의 링크드 리스트가 주어지고 순서대로 더해서 리턴하는 문제.
노드의 값은 0~9고 두 노드를 더해서 10이 넘어가면 다음 덧셈에 값을 올려주어야 한다.
결과를 리턴할 ListNode result; 를 하나 선언한다.
반복문을 돌면서 노드를 덮어씌우기 때문에 원본을 그대로 사용하면 안 된다
얕은 복사를 통해 원본을 하나 복사한다. ListNode copy = result
덧셈을 할 변수 int sum 선언.
매개변수로 주어지는 리스트1 과 리스트2 가 null 이 아니거나 sum 의 값이 0 초과라면 반복문을 계속 돈다.
리스트1 이 null 이 아니라면 sum 에 값을 더해주고 다음 노드로 변경
리스트2 이 null 이 아니라면 sum 에 값을 더해주고 다음 노드로 변경
sum 은 %, / 연산을 통해 덧셈을 해주고
copy.next 에 new ListNode 를 하여 sum 을 val 로 갖게 선언해준다.
copy 도 역시 다음 노드로 변경해준다.
이렇게 연결된 노드의 시작은 result 다음 노드이기 때문에
result.next 를 리턴하면 된다.
원본을 복사하지 않고 문제를 풀면서 왜 해결이 안 됐는지 이해하지 못 했다.
원본 그대로 사용하는 로직의 결과와 복사본을 사용하는 로직의 결과의 차이를 몰랐던 것.
원본을 그대로 사용하는 로직은 31번 라인에서 원본이 덮어쓰기가 되기 때문에
초기화가 된다.
로직은 같다고 볼 수도 있지만 이런 사소한 차이가 결과를 완전히 뒤바꾸게 된다.
위의 코드는 원본을 그대로 사용하는 로직이다. (물론 오답)
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
ListNode copy = result;
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;
}
copy.next = new ListNode(sum % 10);
sum /= 10;
copy = copy.next;
}
return result.next;
}
