리트코드(LeetCode) - 2. Add Two Numbers

Apic·2025년 3월 8일
0

LeetCode

목록 보기
2/2

사이트 링크
문제 링크
난이도: 중

계속 실행하면서 확인하고 싶은데 자주 실행시키면 오류가 발생해서 따로 로컬 jupyter에서 실행시켰다.

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
    def __repr__(self):
        return f"ListNode{{val: {self.val}, next: {repr(self.next)}}}"
        
l1 = ListNode(2, ListNode(4, ListNode(3)))
l2 = ListNode(5, ListNode(6, ListNode(4)))

l1 = ListNode(9, ListNode(9, ListNode(9, ListNode(9, ListNode(9, ListNode(9, ListNode(9)))))))
l2 = ListNode(9, ListNode(9, ListNode(9, ListNode(9))))

print(l1)
print(l2)

'''
ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: None}}}}}}}
ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: ListNode{val: 9, next: None}}}}
'''

코드

# 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]:
        # 더미 헤드 만들기
        dummyHead = ListNode(0)
        curr = dummyHead
        carry = 0 # 올림수 초기화

        # l1, l2가 None이 아니거나 올림수(carry)의 값이 0이 아닌경우에 반복
        # l1, l2중 하나가 None인 경우(둘의 길이가 다를 경우)에도 승수가 있을 경우에 계속 작동
        while l1 is not None or l2 is not None or carry != 0:

            '''
            본래 l1과 l2가 같은 경우에는 
            l1_num = l1.val
            l2_num = l2.val
            이것으로 작동 했지만 둘의 길이가 달랐을 때에는 l1.val, l2.val 둘 중 하나에서 오류가 발생했다.

            어차피 계산식이 끝난 경우(l1, l2 모두 None이 나오고 올림수가 0인 경우)에는 자동으로 종료되기 때문에 계산 할 때 0 대입
            ''' 
            l1_num = l1.val if l1 is not None else 0
            l2_num = l2.val if l2 is not None else 0  

            # 두 수와 올림수를 더한다(기본값 0)
            num_sum = l1_num + l2_num + carry
            # 만약 10이 넘어가면 올림수를 1로 한다.
            carry = num_sum // 10
            # 해당 값으로 새로운 ListNode를 만든다.
            new_node = ListNode(num_sum % 10)
            # dummyHead의 끝부분(curr)에 새로 만든 ListNode를 연결한다.
            curr.next = new_node
            # 다시 노드의 끝 부분으로 간다.
            curr = curr.next

            '''
            여기도 마찬가지로 길이가 다를 경우에는 next 값이 없어 에러가 발생한다.
            따라서 None이 아닌 경우에만 next로 이동하고 None인 경우에는 None을 계속 지속시킨다.
            '''
            l1 = l1.next if l1 is not None else None
            l2 = l2.next if l2 is not None else None

        print(dummyHead.next)

        # 값 보기 편하게 출력(이 부분을 사이트에서 주석을 없애면 에러가 발생한다.)
        # print('[', end='')
        # while dummyHead.next is not None:
        #     print(dummyHead.next.val, end=' ')
        #    dummyHead = dummyHead.next
        # print(']', end='')

        return dummyHead.next
profile
코딩 공부하는 사람

0개의 댓글