|  | 
|  | 1 | +const LinkedList = require('./../util/LinkedList') | 
|  | 2 | +const printList = require('./../util/printList') | 
|  | 3 | + | 
|  | 4 | +function sumLinkedListsForward(list1, list2) { | 
|  | 5 | +  if (!list1 && !list2) { | 
|  | 6 | +    return null | 
|  | 7 | +  } | 
|  | 8 | +  let length1 = length(list1) | 
|  | 9 | +  let length2 = length(list2) | 
|  | 10 | + | 
|  | 11 | +  if (length1 > length2) { | 
|  | 12 | +    list2 = padList(list2, length1 - length2) | 
|  | 13 | +  } else if (length1 < length2) { | 
|  | 14 | +    list1 = padList(list1, length2 - length1) | 
|  | 15 | +  } | 
|  | 16 | + | 
|  | 17 | +  const { head, nextDigitValue } = carryBase10(sumAndAppendNodes(list1, list2), 0) | 
|  | 18 | +  return nextDigitValue ? appendToStart(head, new LinkedList(nextDigitValue)) : head | 
|  | 19 | +} | 
|  | 20 | + | 
|  | 21 | +function length(node) { | 
|  | 22 | +  let count = 0 | 
|  | 23 | +  while (node) { | 
|  | 24 | +    count++ | 
|  | 25 | +    node = node.next | 
|  | 26 | +  } | 
|  | 27 | +  return count | 
|  | 28 | +} | 
|  | 29 | + | 
|  | 30 | +function padList(shortList, padding) { | 
|  | 31 | +  while (padding > 0) { | 
|  | 32 | +    shortList = appendToStart(shortList, new LinkedList(0)) | 
|  | 33 | +    padding-- | 
|  | 34 | +  } | 
|  | 35 | +  return shortList | 
|  | 36 | +} | 
|  | 37 | + | 
|  | 38 | +function appendToStart(head, node) { | 
|  | 39 | +  node.next = head | 
|  | 40 | +  return node | 
|  | 41 | +} | 
|  | 42 | + | 
|  | 43 | +function sumAndAppendNodes(node1, node2) { | 
|  | 44 | +  let value = (node1 ? node1.value : 0) + (node2 ? node2.value : 0) | 
|  | 45 | +  if (!node1.next && !node2.next) { | 
|  | 46 | +    return new LinkedList(value) | 
|  | 47 | +  } | 
|  | 48 | +  const { | 
|  | 49 | +    head, | 
|  | 50 | +    nextDigitValue | 
|  | 51 | +  } = carryBase10(sumAndAppendNodes(node1.next, node2.next), value) | 
|  | 52 | +  return appendToStart(head, new LinkedList(nextDigitValue)) | 
|  | 53 | +} | 
|  | 54 | + | 
|  | 55 | +function carryBase10(head, nextDigitValue) { | 
|  | 56 | +  if (head.value >= 10) { | 
|  | 57 | +    head.value = head.value % 10 | 
|  | 58 | +    nextDigitValue += 1 | 
|  | 59 | +  } | 
|  | 60 | +  return { | 
|  | 61 | +    head, | 
|  | 62 | +    nextDigitValue | 
|  | 63 | +  } | 
|  | 64 | +} | 
|  | 65 | + | 
|  | 66 | +// Input: (6 -> 1 -> 7) + (2 -> 9 -> 5). this case refers to 617 + 295 | 
|  | 67 | +// Output: 9 -> 1 -> 2. the answer refers to 912 | 
|  | 68 | + | 
|  | 69 | +var a = new LinkedList(6) | 
|  | 70 | +var b = new LinkedList(1) | 
|  | 71 | +var c = new LinkedList(7) | 
|  | 72 | + | 
|  | 73 | +a.next = b | 
|  | 74 | +b.next = c | 
|  | 75 | + | 
|  | 76 | +var d = new LinkedList(2) | 
|  | 77 | +var e = new LinkedList(9) | 
|  | 78 | +var f = new LinkedList(5) | 
|  | 79 | + | 
|  | 80 | +d.next = e | 
|  | 81 | +e.next = f | 
|  | 82 | + | 
|  | 83 | +printList(sumLinkedListsForward(a, d)) | 
0 commit comments