양의 정수를 역순으로 한 자리씩 표기한 연결 리스트 l1, l2
두 값을 더한 결과를 똑같이 역순으로 표현한 새 연결 리스트 반환
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let res = new ListNode();
let move = res;
let carry = 0;
while (1) {
let val1 = l1 ? l1.val : 0;
let val2 = l2 ? l2.val : 0;
let sum = val1 + val2 + carry;
if (sum >= 10) {
carry = 1;
move.val = sum - 10;
} else {
carry = 0;
move.val = sum;
}
l1 = l1 ? l1.next : null;
l2 = l2 ? l2.next : null;
if (l1 || l2 || carry) {
move.next = new ListNode();
move = move.next;
} else
break ;
}
return res;
};
새로운 연결 리스트의 첫번째 노드를 반환해야 하므로 res에 저장해둔 뒤
실제 움직임은 move를 사용하여 진행
l1, l2가 모두 끝날 때까지 노드를 이동하면서 l1 + l2 값을 새 노드에 저장
더한 값이 10보다 크다면 다음 자리에 올림해주어야 하므로 carry에 저장 후 일의 자리만 저장
두 노드의 다음 노드가 없어도 carry가 존재한다면 새로운 자리수를(노드) 만들어야 함
Accepted
Runtime 88ms (Beats 98.55%)
Memory 54.94MB (Beats 86.40%)
문제가 친절하게도 자리 역순으로 되어 있어서 잘 해결해낼 수 있었다. 또한 두 수의 덧셈이기 때문에 carry가 1을 넘지 않아서 다루는데에도 편했다. 다만 내 코드에서는 l1과 l2가 null인지 아닌지 두 번 확인하게 되는데 (next로 넘어가기 이전에) 한번의 if문을 통해 묶었어도 되었을 것 같다. 근데 if문 블럭이 그다지 크지 않으면 개인적으로 삼항 연산자를 사용하는 걸 좋아해서 이번에는 이렇게 작성했다. 사실 sum >= 10 부분도 두번 비교하려다가 이건 아닌 것 같아서 if-else로 바꿨다.