Number 2¶

https://leetcode.com/problems/add-two-numbers/

[1]:
from typing import Optional

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def addTwoNumbers(self, l1: [ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        num1 = 0
        num2 = 0
        nl1 = []
        nl2 = []
        while l1!=None:
            nl1.append(l1.val)
            l1 = l1.next
        while l2!=None:
            nl2.append(l2.val)
            l2 = l2.next


        len1 = len(nl1)
        len2 = len(nl2)

        max_len = max(len1, len2)
        diff = abs(len2 - len1)
        pending = [0]*diff
        if len1 < len2:
            nl1 = nl1 + pending
        else:
            nl2 = nl2 + pending


        for i in range(max_len-1,-1,-1):
            num1 = num1+nl1[i]*(10**(i))
            num2 = num2+nl2[i]*(10**(i))

        sum_ = num1+num2

        nl3 = [int(i) for i in list(str(sum_))[::-1]]

        l3 = ListNode()
        dummy = ListNode()
        dummy.val = nl3[0]

        if len(nl3) == 1:
            dummy.next = None
        else:
            dummy.next = l3

        for i in range(1, len(nl3)):
            l3.val = nl3[i]
            if i == len(nl3)-1:
                l3.next = None
            else:
                l3.next = ListNode()
                l3 = l3.next


        return dummy

Testcases for Solution1

[2]:
a = Solution()

n1 = ListNode(2, ListNode(4, ListNode(3, None)))
n2 = ListNode(5, ListNode(6, ListNode(4, None)))
print(a.addTwoNumbers(n1,n2).val)

n1 = ListNode(0, None)
n2 = ListNode(0, None)

print(a.addTwoNumbers(n1,n2).val)

n1 = ListNode(9, ListNode(9,ListNode(9,ListNode(9,ListNode(9,ListNode(9,ListNode(9,None)))))))
n2 = ListNode(9,ListNode(9,ListNode(9,ListNode(9,None))))
print(a.addTwoNumbers(n1,n2).val)


n1 = ListNode(2, ListNode(4,ListNode(9,None)))
n2 = ListNode(5,ListNode(6,ListNode(4,ListNode(9,None))))
print(a.addTwoNumbers(n1,n2).val)


7
0
8
7

Tried a slightly more optimal approach. But Leetcode seemed to think this takes more time even if it takes lesser memory

[3]:
# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution2:
    def addTwoNumbers_modified(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        num1 = 0
        num2 = 0
        nl1 = []
        nl2 = []
        while l1!=None:
            nl1.append(l1.val)
            l1 = l1.next
        while l2!=None:
            nl2.append(l2.val)
            l2 = l2.next


        len1 = len(nl1)
        len2 = len(nl2)

        max_len = max(len1, len2)
        diff = abs(len2 - len1)
        pending = [0]*diff
        if len1 < len2:
            nl1 = nl1 + pending
        else:
            nl2 = nl2 + pending


        for i in range(max_len-1,-1,-1):
            num1 = num1+nl1[i]*(10**(i))
            num2 = num2+nl2[i]*(10**(i))

        sum_ = num1+num2
        sum_ = list(str(sum_))


        l3 = ListNode()
        dummy = ListNode()
        dummy.val = int(sum_[-1])

        if len(sum_) == 1:
            dummy.next = None
        else:
            dummy.next = l3

        for i in range(len(sum_)-2,-1,-1 ):
            l3.val = int(sum_[i])
            if i == 0:
                l3.next = None
            else:
                l3.next = ListNode()
                l3 = l3.next


        return dummy


Test cases for Solution2

[4]:
ab = Solution2()

n1 = ListNode(2, ListNode(4,ListNode(9,None)))
n2 = ListNode(5,ListNode(6,ListNode(4,ListNode(9,None))))
print(ab.addTwoNumbers_modified(n1,n2).val)

n1 = ListNode(2, ListNode(4, ListNode(3, None)))
n2 = ListNode(5, ListNode(6, ListNode(4, None)))
print(ab.addTwoNumbers_modified(n1,n2).next.next.val)

7
8

One of the earliest tries. Blooper max

[5]:
class Solution:
    def addTwoNumbers_mistake(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        num1 = 0
        num2 = 0
        nl1 = []
        nl2 = []
        while l1!=None:
            nl1.append(l1.val)
            l1 = l1.next
        while l2!=None:
            nl2.append(l2.val)
            l2 = l2.next

        len_ = len(nl1)
        for i in range(len_-1,-1,-1):
            num1 = num1+nl1[i]*(10**(len_-i-1))
            num2 = num2+nl2[i]*(10**(len_-i-1))
        sum_ = num1+num2

        nl3 = [int(i) for i in list(str(sum_))[::-1]]

        l3 = ListNode()

        for i in range(len(nl3)):
            l3.val = nl3[i]
            if i == len(nl3)-1:
                l3.next = None
            else:
                l3.next = ListNode()
                l3 = l3.next


        return l3