Advertisement
1988coder

445. Add Two Numbers II

Aug 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.92 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/add-two-numbers-ii/
  3. import java.util.Stack;
  4.  
  5. //   Definition for singly-linked list.
  6. class ListNode {
  7.     int val;
  8.     ListNode next;
  9.  
  10.     ListNode(int x) {
  11.         val = x;
  12.     }
  13. }
  14.  
  15. /**
  16.  * Iterative (No Extra Space)
  17.  *
  18.  * Time Complexity: O(M + N)
  19.  *
  20.  * Space Complexity: O(1)
  21.  *
  22.  * M = Number of nodes in l1. N = Number of nodes in l2.
  23.  */
  24. class Solution1 {
  25.     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  26.         if (l1 == null) {
  27.             return l2;
  28.         }
  29.         if (l2 == null) {
  30.             return l1;
  31.         }
  32.  
  33.         ListNode p = l1;
  34.         ListNode q = l2;
  35.         int len1 = 0;
  36.         int len2 = 0;
  37.  
  38.         while (p != null) {
  39.             len1++;
  40.             p = p.next;
  41.         }
  42.         while (q != null) {
  43.             len2++;
  44.             q = q.next;
  45.         }
  46.  
  47.         p = l1;
  48.         q = l2;
  49.         ListNode tempHead = null;
  50.         while (len1 > 0 && len2 > 0) {
  51.             int sum = 0;
  52.             if (len1 > len2) {
  53.                 sum = p.val;
  54.                 p = p.next;
  55.                 len1--;
  56.             } else if (len1 < len2) {
  57.                 sum = q.val;
  58.                 q = q.next;
  59.                 len2--;
  60.             } else {
  61.                 sum = p.val + q.val;
  62.                 p = p.next;
  63.                 q = q.next;
  64.                 len1--;
  65.                 len2--;
  66.             }
  67.             ListNode node = new ListNode(sum);
  68.             node.next = tempHead;
  69.             tempHead = node;
  70.         }
  71.  
  72.         ListNode dummyResult = new ListNode(1);
  73.         int carry = 0;
  74.         while (tempHead != null) {
  75.             ListNode node = tempHead;
  76.             tempHead = tempHead.next;
  77.  
  78.             node.val += carry;
  79.             carry = node.val / 10;
  80.             node.val %= 10;
  81.  
  82.             node.next = dummyResult.next;
  83.             dummyResult.next = node;
  84.         }
  85.  
  86.         if (carry == 1) {
  87.             return dummyResult;
  88.         }
  89.         return dummyResult.next;
  90.     }
  91. }
  92.  
  93. /**
  94.  * Using stack.
  95.  *
  96.  * Time Complexity: O(M + N)
  97.  *
  98.  * Space Complexity: O(M + N)
  99.  *
  100.  * M = Number of nodes in l1. N = Number of nodes in l2.
  101.  */
  102. class Solution2 {
  103.     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  104.         if (l1 == null) {
  105.             return l2;
  106.         }
  107.         if (l2 == null) {
  108.             return l1;
  109.         }
  110.  
  111.         Stack<Integer> stack1 = new Stack<>();
  112.         Stack<Integer> stack2 = new Stack<>();
  113.         ListNode p = l1;
  114.         ListNode q = l2;
  115.  
  116.         while (p != null) {
  117.             stack1.push(p.val);
  118.             p = p.next;
  119.         }
  120.         while (q != null) {
  121.             stack2.push(q.val);
  122.             q = q.next;
  123.         }
  124.  
  125.         ListNode dummyHead = new ListNode(1);
  126.         int carry = 0;
  127.  
  128.         while (!stack1.isEmpty() || !stack2.isEmpty()) {
  129.             int sum = carry;
  130.             sum += !stack1.isEmpty() ? stack1.pop() : 0;
  131.             sum += !stack2.isEmpty() ? stack2.pop() : 0;
  132.  
  133.             ListNode node = new ListNode(sum % 10);
  134.             carry = sum / 10;
  135.  
  136.             node.next = dummyHead.next;
  137.             dummyHead.next = node;
  138.         }
  139.  
  140.         if (carry == 1) {
  141.             return dummyHead;
  142.         }
  143.         return dummyHead.next;
  144.     }
  145. }
  146.  
  147. /**
  148.  * Recursive Solution
  149.  *
  150.  * Time Complexity: O(M + N)
  151.  *
  152.  * Space Complexity: O(max(M, N))
  153.  *
  154.  * M = Number of nodes in l1. N = Number of nodes in l2.
  155.  */
  156. class Solution3 {
  157.     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  158.         if (l1 == null) {
  159.             return l2;
  160.         }
  161.         if (l2 == null) {
  162.             return l1;
  163.         }
  164.  
  165.         ListNode p = l1;
  166.         ListNode q = l2;
  167.         int len1 = 0;
  168.         int len2 = 0;
  169.  
  170.         while (p != null) {
  171.             len1++;
  172.             p = p.next;
  173.         }
  174.         while (q != null) {
  175.             len2++;
  176.             q = q.next;
  177.         }
  178.  
  179.         ListNode dummyHead = new ListNode(1);
  180.  
  181.         int carry = addTwoNumbersHelper(dummyHead, l1, len1, l2, len2);
  182.         if (carry == 1) {
  183.             return dummyHead;
  184.         }
  185.         return dummyHead.next;
  186.     }
  187.  
  188.     private int addTwoNumbersHelper(ListNode sumListHead, ListNode p, int lenP, ListNode q, int lenQ) {
  189.         if (lenP == 0 && lenQ == 0) {
  190.             return 0;
  191.         }
  192.  
  193.         int sum = 0;
  194.  
  195.         if (lenP > lenQ) {
  196.             sum = addTwoNumbersHelper(sumListHead, p.next, lenP - 1, q, lenQ);
  197.             sum += p.val;
  198.         } else if (lenP < lenQ) {
  199.             sum = addTwoNumbersHelper(sumListHead, p, lenP, q.next, lenQ - 1);
  200.             sum += q.val;
  201.         } else {
  202.             sum = addTwoNumbersHelper(sumListHead, p.next, lenP - 1, q.next, lenQ - 1);
  203.             sum += p.val + q.val;
  204.         }
  205.  
  206.         ListNode node = new ListNode(sum % 10);
  207.         node.next = sumListHead.next;
  208.         sumListHead.next = node;
  209.         return sum / 10;
  210.     }
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement