Add Two (Binary) Numbers | N00tc0d3r


Add Two (Binary) Numbers | N00tc0d3r

Add Two Numbers in Linked List (Stored in Reverse Order)

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

For example: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) => Output: 7 -> 0 -> 8
Since the input lists are already in reverse order, we don't need to worry about carry here.

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  if (l1==null) return l2;
  if (l2==null) return l1;
  int carry = 0;
  ListNode head=null, cur=null;
  while (l1!=null || l2!=null) {
    int sum = carry;
    if (l1!=null) {
      sum+=l1.val;
      l1 = l1.next;
    }
    if (l2!=null) {
      sum+=l2.val;
      l2 = l2.next;
    }
    if (cur==null) { // first node
      cur = new ListNode(sum%10);
      head = cur;
    } else {
      cur.next = new ListNode(sum%10);
      cur = cur.next;
    }
    carry = sum / 10;
  }// end-while
  if (carry>0) cur.next = new ListNode(carry);
  return head;
}

Add Two Numbers in Linked List
This time you are given two linked lists representing two non-negative numbers. Each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

For example: Input: (3 -> 4 -> 2) + (4 -> 6 -> 5) => Output: 8 -> 0 -> 7

Solution
Now the digits are stored in plain order and thus we need to consider how to handle carry.private int length(ListNode ll) {
     int len = 0;
     while (ll != null) {
       ++len;
       ll = ll.next;
     }
     return len;
   }
 
   // The length of l1 >= the lenghth of l2 and n is the difference
   private int addRecursive(ListNode l1, int n, ListNode l2, ListNode pre) {
     if (l1 == null && l2 == null) {
       return 0;
     }
     pre.next = new ListNode(0);
     int sum = l1.val;
     if (n <= 0) {
       sum += l2.val;
       sum += addRecursive(l1.next, 0, l2.next, pre.next);
     } else {
       sum += addRecursive(l1.next, n-1, l2, pre.next);
     }
     pre.val = sum % 10;
     return sum / 10;
   }
 
   // Digits in the two lists are in forward order.
   // i.e. 345 = 3 -> 4 -> 5
   private ListNode addTwoNumbersRecur(ListNode l1, ListNode l2) {
     int n1 = length(l1), n2 = length(l2);
     ListNode dummy = new ListNode(0);
     if (n1 >= n2) {
       dummy.val = addRecursive(l1, n1-n2, l2, dummy);
     } else {
       dummy.val = addRecursive(l2, n2-n1, l1, dummy);
     }
     return (dummy.val > 0) ? dummy : dummy.next;
   }
Iterative solution:
   // Digits in the two lists are in forward order.
   // i.e. 345 = 3 -> 4 -> 5
   private ListNode addTwoNumbersIter(ListNode l1, ListNode l2) {
     ListNode dummy = new ListNode(0), last = dummy, cur = dummy;
     int n1 = length(l1), n2 = length(l2);
     if (n1 < n2) {
       ListNode tmp = l1; l1 = l2; l2 = tmp;
       int n = n1; n1 = n2; n2 = n;
     }
 
     while (n1 > n2) {
       cur.next = new ListNode(l1.val);
       cur = cur.next;
       if (cur.val < 9) last = cur;
       l1 = l1.next;
       --n1;
     }
 
     while (l1 != null) {
       int sum = l1.val + l2.val;
       l1 = l1.next;
       l2 = l2.next;
       cur.next = new ListNode(sum % 10);
       cur = cur.next;
       if (sum / 10 > 0) {
         while (last != cur) {
           last.val = (++last.val) % 10;
           last = last.next;
         }
       } else if (cur.val < 9) {
         last = cur;
       }
     }
 
     return (dummy.val > 0) ? dummy : dummy.next;
   }

Add Two Binary Strings
Given two binary strings, return their sum (also a binary string).
For example, a = "11", b = "1" => Return "100".   public String addBinary(String a, String b) {
    StringBuilder aa = new StringBuilder(a);
    aa.reverse();
    StringBuilder bb = new StringBuilder(b);
    bb.reverse();
    /* 0 + 0 + 0/1 (cap) = 00/01
     * 1 + 1 + 0/1 = 10/11
     * 0 + 1 + 0/1 = 01/10
     */
    char carry = '0';
    StringBuilder res = new StringBuilder();
    int i=0;
    while (i<aa.length() && i<bb.length()) {
      if (aa.charAt(i) == bb.charAt(i)) { // 0+0 or 1+1
        res.append( carry );
        carry = aa.charAt(i);
      } else { // 0+1 or 1+0
        res.append( (carry=='0') ? '1' : '0' );
      }
      ++i;
    }// end-while-aa|bb
    /* 0 + 0/1 = 00/01, 1 + 0/1 = 01/10 */
    while (i<aa.length()) {
      if (aa.charAt(i) == '0') {
        res.append(carry);
        carry = '0';
      } else {
        res.append( (carry=='0') ? '1' : '0' );
      }
      ++i;
    }// end-while-aa  
    while (i<bb.length()) {
      if (bb.charAt(i) == '0') {
        res.append(carry);
        carry = '0';
      } else {
        res.append( (carry=='0') ? '1' : '0' );
      }
      ++i;
    }// end-while-bb
    if (carry=='1') res.append(carry);
    return res.reverse().toString();
  }


 public String addBinary(String a, String b) {
   String longer, shorter;
   int n, m;
   if (a.length() > b.length()) {
     n = a.length(); m = b.length();
     longer = a; shorter = b;
   } else {
     n = b.length(); m = a.length();
     longer = b; shorter = a;
   }
 
   StringBuilder res = new StringBuilder();
   res.append('0'); // dummy head
   // find the last zero
   int lastZero = 0;
   for (int i=0; i<n-m; ++i) {
     res.append(longer.charAt(i));
     if (longer.charAt(i) == '0') lastZero = res.length() - 1;
   }
   // calculate
   for (int i=n-m, j=0; j<m; ++i, ++j) {
     int sum = (longer.charAt(i) == '1') ? 1 : 0;
     sum += (shorter.charAt(j) == '1') ? 1 : 0;
     res.append(sum & 1);
     int cur = res.length() - 1;
     if ((sum >> 1) > 0) {
       res.setCharAt(lastZero, '1');
       for (int k=lastZero+1; k<cur; ++k) {
         res.setCharAt(k, '0');
       }
     }
     if (res.charAt(cur) == '0') lastZero = cur;
   }

   // check head
   if (res.charAt(0) == '0') res.deleteCharAt(0);
   return res.toString();
 }
Read full article from Add Two (Binary) Numbers | N00tc0d3r

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts