파이썬 알고리즘 인터뷰 문제 16번(리트코드 2번) Add Two Numbers
https://leetcode.com/problems/add-two-numbers/
# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
up = 0
dummy = ListNode(0)
curr = dummy
while l1 or l2 or up > 0:
if l1 and l2:
up, val = divmod(l1.val + l2.val + up, 10)
elif l1:
up, val = divmod(l1.val + up, 10)
elif l2:
up, val = divmod(l2.val + up, 10)
elif up > 0:
up, val = 0, up
curr.next = ListNode(val)
curr = curr.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
up = 0
dummy = ListNode(0)
curr = dummy
while l1 or l2 or up > 0:
val = 0
if l1:
val += l1.val
l1 = l1.next
if l2:
val += l2.val
l2 = l2.next
up, val = divmod(val + up, 10)
curr.next = ListNode(val)
curr = curr.next
return dummy.next
사람이 덧셈을 하는 방식을 생각해보면 어렵지 않다.
그리고 그것을 생각해보면 처음 연결리스트가 역순으로 주어진 것이 오히려 자연스럽다.
두 풀이는 본질적으로 같지만 내 풀이 보다 책 풀이가 좀 더 간결하다.