LeetCode/Grind169

2. Add Two Numbers ☆★★

hyunkookim 2024. 12. 7. 16:48

2. Add Two Numbers

 

https://youtu.be/wgFPrzTjm7s?si=DGP0R4iCDigdI7GY

 

https://youtu.be/oRVhdwpTbdU?si=SVZBd8Gq4JuCsoDP

 

# 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]:
        # The digits are stored in reverse order: 역순으로 저장되어 있다.
        # 링크드리스트를 순회하면서 값 더하면 됨
        
        dummy = ListNode()
        cur = dummy

        carry = 0 # 두개 더했을때, 10의 자리 수, 올림수
        
        while l1 or l2 or carry: # carry 가 0이 아니면, 추가해야하므로, 아주 중요!!
            v1 = l1.val if l1 else 0
            v2 = l2.val if l2 else 0

            # new digit
            val = v1 + v2 + carry
            
            # 15
            carry = val // 10
            val = val % 10
            cur.next = ListNode(val)

            # update pointers
            cur = cur.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        
        return dummy.next

 

 

# dummy 노드를 만들어서, 처리하고, dummy->next 를 반환하면 됨. **숙지하자**

 

✅ 정답 방식: 그냥 if l1:으로 체크

if l1:
    l1 = l1.next
  • l1이 현재 노드일 때 None이 아닌지만 확인하고,
  • 다음으로 무조건 넘어감
  • 그 다음 루프에서는 l1 == None이 되니까 종료됨

📌 요약

코드 동작문제  
if l1.next: 마지막 노드에서 .next가 없으면 l1 그대로 → ❌ 무한 루프  
if l1: 현재 노드가 있으면 l1 = l1.next → ✅ 자연스럽게 종료  
 

 

❌ 틀린 방식: if l1.next:

  • 만약 l1 = None이면, l1.next에서 에러 발생
  • 반면 l1이 있을 때는 l1.next가 None이든 아니든 .next로 이동해야 합니다

✅ 정리

조건 설명
if l1: → l1 = l1.next ✅ 안전하게 다음 노드로 이동
if l1.next: → l1 = l1.next ❌ l1이 None이면 에러 발생

그래서 결론은:

“마지막 노드의 .next가 없어도 l1 자체는 존재하기 때문에,
그걸 기준으로 갱신해야 한다.”

 

최종 코드

# 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]:
        carry = 0
        cur= dummy = ListNode()
        while l1 or l2 or carry:
            n1 = l1.val if l1 else 0
            n2 = l2.val if l2 else 0
            total = n1+n2+carry
            carry = total//10
            cur.next = ListNode(total%10)
            cur = cur.next

            if l1: 
                l1 = l1.next
            if l2: 
                l2 = l2.next
        return dummy.next