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