Add Two Numbers

 

1. Clarify the problem: Before diving into solving the problem, let's clarify the requirements:

  • We 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.
  • We need to add the two numbers and return the sum as a linked list.

2. Analyze the problem: To solve this problem, we can traverse both linked lists simultaneously, starting from the head nodes. We'll perform the addition digit by digit and keep track of any carry that occurs during the addition. We'll create a new linked list to store the resulting sum.

3. Design an algorithm: Here is the algorithm to solve the problem:

  1. Initialize a dummy node and a current node to keep track of the result linked list.
  2. Initialize carry as 0.
  3. Traverse both input linked lists simultaneously, until both of them reach the end:
    • Compute the sum of the current nodes' values and the carry.
    • Update the carry if necessary.
    • Create a new node with the sum % 10 as its value and set it as the next node of the current node.
    • Move the current node to the next node.
  4. If there is still a remaining carry, create a new node with the carry as its value and set it as the next node of the current node.
  5. Return the next node of the dummy node as the resulting linked list.

4. Explain your approach: The approach involves traversing both linked lists simultaneously, performing the addition digit by digit, and keeping track of any carry. We create a new linked list to store the resulting sum and return it at the end.

5. Write clean and readable code:

python
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def addTwoNumbers(l1, l2): dummy = ListNode() curr = dummy carry = 0 while l1 or l2: x = l1.val if l1 else 0 y = l2.val if l2 else 0 sum_val = x + y + carry carry = sum_val // 10 curr.next = ListNode(sum_val % 10) curr = curr.next if l1: l1 = l1.next if l2: l2 = l2.next if carry: curr.next = ListNode(carry) return dummy.next

6. Test your code: Let's test the code with the given test case:

  • Test case:
    • List 1: 2 -> 4 -> 3 (represents the number 342)
    • List 2: 5 -> 6 -> 4 (represents the number 465)
    • The expected output is a linked list: 7 -> 0 -> 8 (represents the number 807).
python
# Test case l1 = ListNode(2) l1.next = ListNode(4) l1.next.next = ListNode(3) l2 = ListNode(5) l2.next = ListNode(6) l2.next.next = ListNode(4) result = addTwoNumbers(l1, l2) # Print the resulting linked list while result: print(result.val, end=" ") result = result.next # Expected output: 7 0 8

7. Optimize if necessary: The current solution is straightforward and doesn't have any obvious optimization opportunities.

8. Handle error cases: The code assumes that the input linked lists are non-empty. If the input lists are empty or if there are any other invalid inputs, the behavior of the code may not be as expected.

9. Discuss complexity analysis: The time complexity of the solution is O(max(m, n)), where m and n are the lengths of the input linked lists. We need to iterate through both lists once. The space complexity is O(max(m, n)) as well because we need to create a new linked list to store the result.

Next Post Previous Post