0445. Add Two Numbers II

Medium | Linked List + Math | 60 ms (98.66%), 14.2 MB (90.09%)

Source: LeetCode - Add Two Numbers II GitHub: Solution / Performance

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up: Could you solve it without reversing the input lists?

  • Method 1 - Append nodes to the linked list that has a shorter length

  • Method 2 - Reverse linked list to add numbers, then reverse again to return

  • Method 3 - Using two stacks to avoid reversing the linked lists

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:

        # ==================================================
        #  Linked List                        (Recursive)  =
        # ==================================================
        # time  : O(m+n)
        # space : O(abs(m-n))
        
        len1, len2 = self.length(l1), self.length(l2)
        if   len1 > len2: l2 = self.fill(l2, len1 - len2)
        elif len2 > len1: l1 = self.fill(l1, len2 - len1)

        carry, ret = self.merge(l1, l2)
        if carry: ret = ListNode(1, ret)
        
        return ret
        
    def length(self, l: ListNode) -> int:
        length, tmp = 0, l
        while tmp:
            length += 1
            tmp = tmp.next
        return length

    def fill(self, l: ListNode, num: int) -> ListNode:
        ret = head = ListNode(-1)
        for i in range(num):
            head.next = ListNode(0)
            head = head.next
        head.next = l
        return ret.next

    # Recursive to merge two lists while summing nodes' values
    def merge(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1 and not l2: return (0, None)
        carry, next = self.merge(l1.next, l2.next)
        curSum = l1.val + l2.val + carry
        node = ListNode(curSum % 10, next)
        return (curSum // 10, node)

Last updated