
그냥 단순한 풀이법을 택한 후(숫자로 만들어서 더하고 정답이 될 연결리스트 만들기)
하드 코딩으로 풀어서 맞혔다.
# 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]:
l1_num, l2_num = 0, 0
dum1 = ListNode()
dum1.next = l1
dum2 = ListNode()
dum2.next = l2
cur = dum1
i = 0
while cur.next is not None:
l1_num += cur.next.val * 10**i
print(l1_num)
cur = cur.next
i += 1
cur = dum2
i = 0
while cur.next is not None:
l2_num += cur.next.val * 10**i
cur = cur.next
i += 1
l3_num = l1_num + l2_num
dum3 = ListNode()
cur = dum3
for item in str(l3_num)[::-1]:
cur.next = ListNode(int(item))
cur = cur.next
return dum3.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]:
def toNum(lis):
i, num = 0, 0
dum = ListNode()
dum.next = lis
cur = dum
while cur.next is not None:
num += cur.next.val * 10**i
cur = cur.next
i += 1
return num
res = toNum(l1) + toNum(l2)
dummy = ListNode()
current = dummy
for item in str(res)[::-1]:
current.next = ListNode(int(item))
current = current.next
return dummy.next
책에 나온 풀이이다. 문제의 의도에 더욱 적합한 풀이라고 볼 수 있다.
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
root = cur = ListNode() ###
carry = 0
while l1 or l2 or carry: ###
s = 0
# 두 입력값의 합 계산
if l1: ###
s += l1.val
l1 = l1.next
if l2:
s += l2.val
l2 = l2.next
carry, val = divmod(s+carry, 10) ###
cur.next = ListNode(val) ###
cur = cur.next
return root.next
특징
cur.next = ListNode(val) 이렇게 생성함.l1 or l2 or carry