← Linked Lists

Add Two Numbers

Medium
Python
def add_two_numbers(l1,l2):
    dummy=type('N',(),{'val':0,'next':None})()
    cur=dummy; carry=0
    while l1 or l2 or carry:
        a=l1.val if l1 else 0; b=l2.val if l2 else 0
        carry,rem=divmod(a+b+carry,10)
        cur.next=type('N',(),{'val':rem,'next':None})()
        cur=cur.next
        if l1: l1=l1.next
        if l2: l2=l2.next
    return dummy.next
Java
public ListNode addTwoNumbers(ListNode l1,ListNode l2){
    ListNode dummy=new ListNode(0),cur=dummy; int carry=0;
    while(l1!=null||l2!=null||carry!=0){
        int a=l1!=null?l1.val:0; int b=l2!=null?l2.val:0;
        int sum=a+b+carry; carry=sum/10;
        cur.next=new ListNode(sum%10); cur=cur.next;
        if(l1!=null) l1=l1.next;
        if(l2!=null) l2=l2.next;
    } return dummy.next;
}

Key Insight

divmod() gets carry and remainder together.

Python → Java Differences

  • divmod() vs % and /
  • Truthiness vs !=null
  • Digit addition identical
Python
def add_two_numbers(l1,l2):
    dummy=type('N',(),{'val':0,'next':None})()
    cur=dummy; carry=0
    while l1 or l2 or carry:
        a=l1.val if l1 else 0; b=l2.val if l2 else 0
        carry,rem=divmod(a+b+carry,10)
        cur.next=type('N',(),{'val':rem,'next':None})()
        cur=cur.next
        if l1: l1=l1.next
        if l2: l2=l2.next
    return dummy.next
Java
public ListNode addTwoNumbers(ListNode l1,ListNode l2){
    ListNode dummy=new ListNode(0),cur=dummy; int carry=0;
    while(l1!=null||l2!=null||carry!=0){
        int a=l1!=null?l1.val:0; int b=l2!=null?l2.val:0;
        int sum=a+b+carry; carry=sum/10;
        cur.next=new ListNode(sum%10); cur=cur.next;
        if(l1!=null) l1=l1.next;
        if(l2!=null) l2=l2.next;
    } return dummy.next;
}

Algorithm Steps

1. Process digits with carry
2. New node per sum