[Python] Leetcode 2. Add Two Numbers

Coding Test

목록 보기
15/16

1️⃣ 내 풀이

그냥 단순한 풀이법을 택한 후(숫자로 만들어서 더하고 정답이 될 연결리스트 만들기)
하드 코딩으로 풀어서 맞혔다.

# 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 

2️⃣ 모범 풀이

책에 나온 풀이이다. 문제의 의도에 더욱 적합한 풀이라고 볼 수 있다.

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) 이렇게 생성함.
  • 반복 조건식은 carry를 고려하여 l1 or l2 or carry
profile
학습 메모장 : 코테 및 알고리즘, 언어 문법, Java 기본 강의...

0개의 댓글