天天看点

leetcode_2-两数相加_javascript

题目

2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路

  • JavaScript解法
  • 这个题目之前咋一看以为很简单,只要数组每项相加取余进位就可以了,但是我网络它是链表哇!!!所以一开始给我们的两个好像是数组的东东,其实是两个链表的首部,知道了这个之后,解题就变得简单了。具体的解释见代码注释。
  • 复杂度的话取决于最大的数的位数,运行时间在130ms左右,内存消耗41.5MB左右

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *  看这里看这里,先看看ListNode
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
  let temp = new ListNode(0); // 可以先看看上面ListNode的结构
  const result = temp; // 记录结果指针的首部
  let index = 0; // 进位,用于记录两数相加是否进位
  for (;l1||l2||index;) { // 当且仅当l1,l2皆为null且无进位时,结束循环
    let next = new ListNode(); // 新建一个节点

    temp.next = next; // 将结果链表的下一个指向新创建的节点
    temp = next; // 将结果链表的当前节点设为新创建的节点,以便下次循环可以接上

    let val = index; // val是进位与两个数当前位相加的结果,这里先设为进位的数值

    if (l1) { // l1不为null的时候,可以认定l1.val不为undefined,下面同理
      val += l1.val;
      l1 = l1.next;
  }
    if (l2) {
      val += l2.val;
      l2 = l2.next;
  }

    next.val = val; // 因为是引用类型,所以这里也可以写作temp.val
  
    if (next.val > 9) {
      index = 1; // 进位
      next.val %= 10;
    } else {
      index = 0;
    }
    next = null //释放内存
  }
  return result.next; //注意这里是下一个节点
};
           

注意点

  • 这个题目主要就是要理解好链表是怎么一回事,再去写的时候就很顺风顺水了。