两数之和
题目如下: 1l,l2 链表结构,要求存放在链表的节点相加
1 2 3 4 5 6 7 8 9
   | l1: 1-2->3 l2: 1->2->3 输出: 2->3->6;
  l1: 1->7->3 l2: 2->3->1
  输出 : 3->0->5
 
 
  | 
 
先说思路,我们自然要遍历我们的 l1,l2,了,但如何遍历呢?指针迭代法(while),递归法(浪费空间)。
一般而言,都是采用指针迭代法。下面根据实现的代码,作注释讲解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
   | function addNums(l1, l2) {   let header = null,     last = null;   let carry = 0; 
    while (l1 || l2) {     
 
 
 
      let n1 = l1.val || 0;     let n2 = l2.val || 0;
      let sum = n1 + n2 + carry;
      if (!header) {              header = last = new NodeList(sum % 10);     } else {       
 
        last.next = new NodeList(sum % 10);              last = last.next;     }     if (l1) {       l1 = l1.next;     }     if (l2) {       l2 = l2.next;     }     carry = sum > 10 ? 1 : 0;   }
    if (carry > 0) {     last.next = new NodeList(1);   }      return header; }
 
  | 
 
总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
   | var addTwoNumbers = function (l1, l2) {   let result = {};   recursion(l1, l2, result, 0);   
    return result; };
  function recursion(l1, l2, obj, isOverTen) {   obj.next = {};
    if (l1 && l2) {          obj.val = l1.val + l2.val + (isOverTen ? 1 : 0);          let isOver = obj.val > 9;     obj.val = isOver ? obj.val - 10 : obj.val;
      if (l1.next !== null && l2.next !== null) {     }
      recursion(l1.next, l2.next, obj.next, isOver);   }
             
             
    if (l1 === null && l2 === null) {     if (isOverTen) {       obj.val = l;     }     obj.next = undefined;   } }
 
  | 
 
我一开始用的递归法,但能力有限,构造不出想要的链结构,没有找对递归的终止条件。对于链表,还是使用指针的方式最为稳妥,一个指针不够。我们可以用两个,甚至三个。如何构造一个链表呢,借助一个头尾节点,创建新的尾节点的时候,要不断改变 last 的指向,使 last 是指向 最新节点,这样才能构建一个链。