두 리스트의 원소들을 더하는 문제이다. 일단 연결 리스트의 값에 접근 해야되기 때문에 두 리스트를 순회해야한다고 생각했다.
리스트 순회는 head에서 시작하여 다음 노드 next
가 None
일때까지 순회하면 된다.
문제에서 l1
,l2
리스트의 길이가 다를 수 있기 때문에
두 리스트가 완전히 None
이 될때까지 순회하여야 하는 대신에
다음 노드가 있는 경우에만 리스트 = 리스트.다음노드
를 이용해 리스트를 이동하고 node
또한 이동한다. 그리고 일반적으로 덧셈을 하는것과 마찬가지로 자리 올림이 발생하면 overflow
변수에 저장해놓고 높은 자릿수에 더해준 후 overflow
변수를 0으로 둔다.
모든 리스트 순회를 마치고나서도 자리 올림이 발생했다면 마지막 노드에서 올림수 1을 이용해서 노드를 하나 더 만들고 마지막노드에 연결한다. 그리고 head
를 반환한다.
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode()
node = head
overflow = 0
while l1 or l2:
node.val = overflow
overflow = 0
node.val += l1.val if l1 else 0
node.val += l2.val if l2 else 0
if node.val >= 10:
overflow = 1
node.val %= 10
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if l1 or l2:
node.next = ListNode()
node = node.next
if overflow:
node.next = ListNode(overflow)
return head
var addTwoNumbers = function(l1, l2) {
let overflow = 0;
const head = new ListNode();
let node = head;
while(l1 || l2){
node.val = overflow;
overflow = 0;
node.val += (l1 === null ? 0 : l1.val);
node.val += (l2 === null ? 0 : l2.val);
if(node.val >= 10){
overflow = 1;
node.val %= 10;
}
if(l1){
l1 = l1.next;
}
if(l2){
l2 = l2.next;
}
if(l1 || l2){
node.next = new ListNode();
node = node.next;
}
}
if(overflow){
node.next = new ListNode(overflow);
}
return head;
};