Add Two Numbers
Problem Statement
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, 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.
Examples
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0]
Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
Constraints
- The number of nodes in each linked list is in the range
[1, 100]
. 0 <= Node.val <= 9
- It is guaranteed that the list represents a number that does not have leading zeros.
Solution Approach
Understanding the Problem
The key insight is that the digits are stored in reverse order:
- [2,4,3] represents 342 (2 + 40 + 300)
- [5,6,4] represents 465 (5 + 60 + 400)
- The result [7,0,8] represents 807
Algorithm
- Initialize a dummy head node and a carry variable
- Traverse both lists simultaneously
- At each position:
- Add values from both lists (0 if one list is shorter)
- Add the carry from the previous addition
- Create a new node with the digit (sum % 10)
- Update carry for the next iteration (sum / 10)
- Continue until both lists are exhausted and carry is 0
- Return the list starting from dummy.next
Edge Cases to Consider
- Different lengths: One list may be longer than the other
- Carry at the end: Final carry may create an additional digit
- Single digit: Lists with only one node
- Large numbers: Multiple carries in sequence