❓ Problem Statement ✍🏻 Constraints & Example
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?
Constraints:
The number of nodes in each linked list is in the range [1, 100]
.
It is guaranteed that the list represents a number that does not have leading zeros.
Copy Input: l1 = [7,2,4,3], l2 = [5,6,4]
Output: [7,8,0,7]
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [8,0,7]
Input: l1 = [0], l2 = [0]
Output: [0]
🤖 Python3 🤖 Python3 (Reverse) 🤖 Python3 (Stack) 🤖 Java
Copy 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)
Copy class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# ==================================================
# Reverse Linked List =
# ==================================================
# time : O(m+n)
# space : O(1)
l1, l2 = self.reverse(l1), self.reverse(l2)
return self.reverse(self.add(l1, l2))
def reverse(self, head: ListNode) -> ListNode:
pre = None
while head:
tmp = head.next
head.next = pre
pre, head = head, tmp
return pre
def add(self, l1: ListNode, l2: ListNode) -> ListNode:
ret = cur = ListNode(0)
carry = 0
while l1 or l2:
if l1: n1, l1 = l1.val, l1.next
else: n1 = 0
if l2: n2, l2 = l2.val, l2.next
else: n2 = 0
total = n1 + n2 + carry
carry = total // 10
total %= 10
cur.next = ListNode(total)
cur = cur.next
if carry: cur.next = ListNode(1)
return ret.next
Copy class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# ==================================================
# Linked List + Stack =
# ==================================================
# time : O(m+n)
# space : O(m+n)
stack1, stack2 = [], []
while l1:
stack1.append(l1.val)
l1 = l1.next
while l2:
stack2.append(l2.val)
l2 = l2.next
carry, ret = 0, None
while stack1 or stack2 or carry:
val1 = stack1.pop() if stack1 else 0
val2 = stack2.pop() if stack2 else 0
curSum = val1 + val2 + carry
carry = curSum // 10
curSum = curSum % 10
ret = ListNode(curSum, ret)
return ret
Copy class Solution {
/**
* @time : O(m+n)
* @space : O(m+n)
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
while(l1 != null) {
stack1.push(l1.val);
l1 = l1.next;
};
while(l2 != null) {
stack2.push(l2.val);
l2 = l2.next;
}
int carry = 0;
ListNode ret = null;
while (!stack1.empty() || !stack2.empty() || carry != 0) {
int val1 = (!stack1.empty()) ? stack1.pop() : 0;
int val2 = (!stack2.empty()) ? stack2.pop() : 0;
int curSum = val1 + val2 + carry;
carry = curSum / 10;
curSum = curSum % 10;
ret = new ListNode(curSum, ret);
}
return ret;
}
}