Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    [LeetCode 2] Add Two Numbers

    Published Oct 05, 2021 [  LinkedList  ]

    Problem

    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.

    Example 1

    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.

    Thoughts

    • A dummy head helps with the single linked list problem
    • We can loop two lists until they are all null, note their lengths may be different
    • Carry value is used in the current value calculation
    • Note there may be ending extra carry

    Code

    Typescript

    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     val: number
     *     next: ListNode | null
     *     constructor(val?: number, next?: ListNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.next = (next===undefined ? null : next)
     *     }
     * }
     */
    
    function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
        let dummyHead = new ListNode(0);
        let cur = dummyHead;
        let l1Val, l2Val, tempVal, curVal, carry = 0;
        
        while(l1 !== null || l2 !== null) {    
            // handle null node value access
            l1Val = l1 === null ? 0 : l1.val;
            l2Val = l2 === null ? 0 : l2.val;
            // calculate value with the carry
            tempVal = l1Val + l2Val + carry;
            carry = tempVal >= 10 ? 1 : 0;
            curVal = carry ? tempVal - 10 : tempVal
            cur.next = new ListNode(curVal);
            cur = cur.next;
            
            // go to next node if possible
            l1 = l1 === null ? l1 : l1.next;
            l2 = l2 === null ? l2 : l2.next;
        }
    
        // don't forget the ending carry
        if(carry) {
            cur.next = new ListNode(1)
        }
        
        return dummyHead.next;
    };
    

    Reference