Bird
Raised Fist0
DSA Pythonprogramming

Add Two Numbers Represented as Linked List in DSA Python

Choose your learning style10 modes available
Mental Model
Each linked list holds a number in reverse order, and we add digits one by one like elementary addition with carry.
Analogy: Imagine adding two numbers digit by digit from right to left, just like adding two numbers on paper starting from the units place.
List1: 2 -> 4 -> 3 -> null
List2: 5 -> 6 -> 4 -> null
Each node holds one digit, starting from the smallest place value.
Dry Run Walkthrough
Input: list1: 2->4->3 (represents 342), list2: 5->6->4 (represents 465)
Goal: Add the two numbers and return the sum as a linked list in the same reversed digit format.
Step 1: Add first digits 2 + 5 = 7, no carry
Result: 7 -> null
Why: Start adding from the units place, store sum digit in new list
Step 2: Add second digits 4 + 6 = 10, store 0 and carry 1
Result: 7 -> 0 -> null
Why: Sum exceeds 9, so keep 0 and carry 1 to next digit
Step 3: Add third digits 3 + 4 + carry 1 = 8, no carry
Result: 7 -> 0 -> 8 -> null
Why: Add last digits plus carry, store result digit
Result:
7 -> 0 -> 8 -> null (represents 807)
Annotated Code
DSA Python
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
    dummy_head = ListNode(0)
    current = dummy_head
    carry = 0
    while l1 or l2 or carry:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        total = val1 + val2 + carry
        carry = total // 10
        current.next = ListNode(total % 10)
        current = current.next
        if l1:
            l1 = l1.next
        if l2:
            l2 = l2.next
    return dummy_head.next

def printList(node: ListNode):
    while node:
        print(node.val, end='')
        if node.next:
            print(' -> ', end='')
        node = node.next
    print(' -> null')

# Driver code
# Create list1: 2 -> 4 -> 3 -> null
l1 = ListNode(2, ListNode(4, ListNode(3)))
# Create list2: 5 -> 6 -> 4 -> null
l2 = ListNode(5, ListNode(6, ListNode(4)))
result = addTwoNumbers(l1, l2)
printList(result)
while l1 or l2 or carry:
continue adding while there are digits or carry left
val1 = l1.val if l1 else 0 val2 = l2.val if l2 else 0
get current digit values or 0 if list ended
total = val1 + val2 + carry carry = total // 10
sum digits and update carry for next addition
current.next = ListNode(total % 10) current = current.next
create new node with sum digit and move pointer
if l1: l1 = l1.next if l2: l2 = l2.next
advance input list pointers to next digits
OutputSuccess
7 -> 0 -> 8 -> null
Complexity Analysis
Time: O(max(m, n)) because we traverse both lists once where m and n are their lengths
Space: O(max(m, n)) for the output list which can be at most one digit longer than inputs
vs Alternative: This approach is efficient compared to converting lists to numbers and back, which can cause overflow and extra conversions
Edge Cases
One list is empty
The function returns the other list as the sum
DSA Python
val1 = l1.val if l1 else 0
Sum results in an extra digit carry (e.g., 5 + 5 = 10)
An extra node is added to hold the carry digit
DSA Python
while l1 or l2 or carry:
Lists of different lengths
Shorter list digits are treated as 0 after end
DSA Python
val2 = l2.val if l2 else 0
When to Use This Pattern
When you see two numbers stored as linked lists with digits in reverse order, use digit-by-digit addition with carry to sum them efficiently.
Common Mistakes
Mistake: Not handling the carry after the last digits are added
Fix: Include carry in the while loop condition to add an extra node if needed
Mistake: Advancing pointers without checking if they are None
Fix: Check if l1 or l2 is not None before moving to next node
Summary
Adds two numbers represented as reversed linked lists digit by digit with carry.
Use when numbers are too large to convert to integers or are given as linked lists.
Add digits from right to left, keep track of carry, and build the result list on the go.

Practice

(1/5)
1. What does the problem "Add Two Numbers Represented as Linked List" mainly involve?
easy
A. Adding two numbers where each digit is stored in a node of a linked list
B. Sorting two linked lists in ascending order
C. Finding the middle node of a linked list
D. Reversing a linked list

Solution

  1. Step 1: Understand the problem context

    The problem involves two linked lists where each node contains a single digit of a number, stored in reverse order.
  2. Step 2: Identify the main operation

    We need to add these two numbers digit by digit, handling carry, and return the sum as a linked list.
  3. Final Answer:

    Adding two numbers where each digit is stored in a node of a linked list -> Option A
  4. Quick Check:

    Adding digits node-wise = Adding numbers represented as linked lists [OK]
Hint: Focus on digit-wise addition with carry in linked lists [OK]
Common Mistakes:
  • Confusing addition with sorting
  • Thinking the digits are stored in normal order
  • Ignoring carry during addition
2. Which of the following is the correct way to create a node class for a singly linked list in Python for this problem?
easy
A. class Node: def __init__(self, val=0, next=None): self.val = val self.next = next
B. class Node: def __init__(self, val, next): val = self.val next = self.next
C. class Node: def __init__(self): self.value = 0 self.next = None
D. class Node: def __init__(self, val): self.val = val self.next = val

Solution

  1. Step 1: Check correct attribute assignment

    class Node: def __init__(self, val=0, next=None): self.val = val self.next = next correctly assigns the value and next pointer using self.val and self.next.
  2. Step 2: Verify default parameters and syntax

    class Node: def __init__(self, val=0, next=None): self.val = val self.next = next uses default values and proper syntax for linked list node creation.
  3. Final Answer:

    class Node: def __init__(self, val=0, next=None): self.val = val self.next = next -> Option A
  4. Quick Check:

    Correct node class syntax = class Node: def __init__(self, val=0, next=None): self.val = val self.next = next [OK]
Hint: Use self to assign attributes inside __init__ [OK]
Common Mistakes:
  • Reversing assignment order (val = self.val)
  • Forgetting to use self for attributes
  • Incorrect default parameters
3. What will be the output linked list after adding these two numbers represented as linked lists? List 1: 2 -> 4 -> 3 -> null (represents 342) List 2: 5 -> 6 -> 4 -> null (represents 465) Code snippet:
def addTwoNumbers(l1, l2):
    carry = 0
    dummy = Node(0)
    current = dummy
    while l1 or l2 or carry:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        total = val1 + val2 + carry
        carry = total // 10
        current.next = Node(total % 10)
        current = current.next
        if l1: l1 = l1.next
        if l2: l2 = l2.next
    return dummy.next
medium
A. 7 -> 10 -> 7 -> null
B. 8 -> 0 -> 7 -> null
C. 2 -> 0 -> 8 -> null
D. 7 -> 0 -> 8 -> null

Solution

  1. Step 1: Add digits with carry

    Adding 2+5=7 (carry 0), 4+6=10 (carry 1), 3+4+1=8 (carry 0).
  2. Step 2: Form the resulting linked list

    Digits are 7 -> 0 -> 8 representing 807, which is 342+465.
  3. Final Answer:

    7 -> 0 -> 8 -> null -> Option D
  4. Quick Check:

    342 + 465 = 807 = 7->0->8 [OK]
Hint: Add digits and carry, build new nodes for sum digits [OK]
Common Mistakes:
  • Not handling carry correctly
  • Mixing digit order in output
  • Adding digits without carry
4. Identify the bug in this code snippet for adding two numbers represented as linked lists:
def addTwoNumbers(l1, l2):
    carry = 0
    dummy = Node(0)
    current = dummy
    while l1 or l2:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        total = val1 + val2 + carry
        carry = total // 10
        current.next = Node(total % 10)
        current = current.next
        if l1: l1 = l1.next
        if l2: l2 = l2.next
    return dummy.next
medium
A. The initial dummy node is not created
B. The loop misses processing carry after both lists end
C. The nodes are not linked properly
D. The carry is not calculated correctly

Solution

  1. Step 1: Analyze loop condition

    The loop runs only while l1 or l2 exist, but if carry remains after both end, it is ignored.
  2. Step 2: Identify missing carry handling

    Carry should be checked in loop condition to add an extra node if needed.
  3. Final Answer:

    The loop misses processing carry after both lists end -> Option B
  4. Quick Check:

    Loop must include carry to avoid missing last digit [OK]
Hint: Include carry in loop condition to handle last digit [OK]
Common Mistakes:
  • Ignoring carry after lists end
  • Wrong loop condition
  • Not updating current pointer
5. Given two linked lists representing numbers in reverse order, how would you modify the addition function to handle numbers stored in forward order (most significant digit first)?
hard
A. Use recursion to add digits from head to tail without reversing
B. Add digits directly without reversing, starting from head
C. Reverse both lists, add as usual, then reverse the result
D. Convert lists to integers, add, then convert back to linked list

Solution

  1. Step 1: Understand digit order difference

    Forward order means most significant digit is at head, so addition must start from tail.
  2. Step 2: Reverse lists to reuse existing logic

    Reversing lists makes digits least significant first, allowing normal addition and then reversing result restores order.
  3. Final Answer:

    Reverse both lists, add as usual, then reverse the result -> Option C
  4. Quick Check:

    Reverse to handle forward order addition [OK]
Hint: Reverse lists to reuse reverse-order addition logic [OK]
Common Mistakes:
  • Adding digits from head without reversing
  • Ignoring digit order difference
  • Converting to int may cause overflow
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard