Problem Statement:
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each node contains a single digit. Add the two numbers and return the result as a linked list.
You may assume the two numbers do not contain any leading zeros, except the number 0 itself.
Examples:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807
Input: l1 = [0], l2 = [0]
Output: [0]
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.
Approach:
- Initialize a dummy node to build the result list and a
carryvariable set to 0. - Traverse both linked lists simultaneously. For each node, compute the sum of values plus carry.
- Create a new node with
sum % 10and update carry tosum / 10. - Continue until both lists are exhausted and carry becomes 0.
Time and Space Complexity:
- Time Complexity: O(n) where n is the length of the longer list.
- Space Complexity: O(n) for the new list created.
var addTwoNumbers = function(l1, l2) {
let dummy = new ListNode(0);
let curr = dummy;
let carry = 0;
while (l1 || l2 || carry) {
let sum = (l1?.val || 0) + (l2?.val || 0) + carry;
carry = Math.floor(sum / 10);
curr.next = new ListNode(sum % 10);
curr = curr.next;
l1 = l1?.next;
l2 = l2?.next;
}
return dummy.next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode dummy = {0, NULL};
struct ListNode* curr = &dummy;
int carry = 0;
while (l1 || l2 || carry) {
int sum = carry + (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
carry = sum / 10;
curr->next = malloc(sizeof(struct ListNode));
curr = curr->next;
curr->val = sum % 10;
curr->next = NULL;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
return dummy.next;
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode();
ListNode* curr = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int sum = carry;
if (l1) { sum += l1->val; l1 = l1->next; }
if (l2) { sum += l2->val; l2 = l2->next; }
carry = sum / 10;
curr->next = new ListNode(sum % 10);
curr = curr->next;
}
return dummy->next;
}
};
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int sum = carry;
if (l1 != null) { sum += l1.val; l1 = l1.next; }
if (l2 != null) { sum += l2.val; l2 = l2.next; }
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
}
return dummy.next;
}
}
class Solution(object):
def addTwoNumbers(self, l1, l2):
dummy = ListNode(0)
curr = dummy
carry = 0
while l1 or l2 or carry:
sum = carry
if l1:
sum += l1.val
l1 = l1.next
if l2:
sum += l2.val
l2 = l2.next
carry = sum // 10
curr.next = ListNode(sum % 10)
curr = curr.next
return dummy.next
public class Solution {
public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int sum = carry;
if (l1 != null) { sum += l1.val; l1 = l1.next; }
if (l2 != null) { sum += l2.val; l2 = l2.next; }
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
}
return dummy.next;
}
}
