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?
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
Was this helpful?