You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0] Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] Output: [8,9,9,9,0,0,0,1]
Constraints:
The number of nodes in each linked list is in the range [1, 100]. 0 <= Node.val <= 9 It is guaranteed that the list represents a number that does not have leading zeros.
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: resNode = tempNode = ListNode() carry = 0 while l1 or l2 or carry: val_1 = val_2 = 0 if l1 is not None: val_1 = l1.val l1 = l1.next if l2 is not None: val_2 = l2.val l2 = l2.next sum = val_1 + val_2 + carry carry = sum//10 tempNode.next = ListNode(sum%10) tempNode = tempNode.next return resNode.next
resNode = tempNode = ListNode()
resNode
는 최종 결과를 저장할 Linked ListtempNode
는 각 자리수를 더하면서 임시로 저장할 Linked Listcarry = 0
carry
는 자리수끼리 더했을 때 10이 넘어가면 다음 자리수로 1을 올려주기 위한 변수while l1 or l2 or carry:
l1
또는 l2
가 빈 값이 아니거나 (None이 아니거나, 즉, 값을 가지고 있거나) carry의 값이 1이면 반복문을 계속 실행한다.val_1 = val_2 = 0
if l1 is not None:
val_1 = l1.val
l1 = l1.next
if l2 is not None:
val_2 = l2.val
l2 = l2.next
이 과정이 위에서 말한 것이다. 현재 이 노드가 값을 가지고 있으면 0으로 초기화 했던 val_1
과 val_2
값을 그 노드의 값으로 다시 저장한다. 그 다음 각 리스트를 다음 노드부터 시작하는 리스트로 바꿔준다.
l1 = 2 -> 4 -> 3
이면 val_1 = 2
가 되고 2를 따로 저장해 주었으니 l1 = 4 -> 3
으로 바꿔준다는 얘기이다.sum = val_1 + val_2 + carry
carry = sum//10
sum//10
을 해주면 몫이 1이 나온다. 10을 넘지 않으면 sum//10
을 해주면 몫이 0이므로 carry
비트는 0이다.tempNode.next = ListNode(sum%10)
tempNode
를 처음에 tempNode = ListNode()
로 해주었는데 코드 젤 위에 주석처리 된 곳을 보면 인자값에 self, val=0, next=None
이렇게 적혀있다. 인자가 들어올 곳에 이렇게 적어주면, 함수나 클래스를 호출할 때 인자값을 안넣어주면 내가 그냥 알아서 인자값 이걸로 설정할게~
라고 컴파일러가 이해한다.tempNode
의 첫번째 값은 0이고 다음 연결된 노드는 없다는 뜻이다. (0 -> (None)
)tempNode.next = ListNode(sum%10)
이라고 되어있으니 tempNode
의 다음 노드에 sum%10
의 값을 가진 노드를 연결한다는 뜻이다. sum = 7
이었으니까 sum%10 = 7
이고 tempNode
의 다음 노드는 7이 된다. (0 -> 7 -> (None)
)tempNode = tempNode.next
tempNode = 0 -> 7 -> (None)
이므로 tempNode.next = 7 -> (None)
이고 tempNode = tempNode.next
라고 하면 tempNode = 7 -> (None)
이 된다.