【leetcode】2. 两数相加

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

若是,咱们将这两个数相加起来,则会返回一个新的链表来表示它们的和。java

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

示例:算法

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
缘由:342 + 465 = 807

实现思路:性能

典型的链表遍历操做题,很是简单的指针操做,作题时注意考虑到边界条件判断便可。this

  1. 实例化结果链表 result
  2. 建立 3 个 Node 变量(代替指针)指向 被加数链表 的第二个节点(由于头节点在实例化 result 时已经操做过)以及 result 链表 的头节点;
  3. 循环链表直至最长的链表遍历结束以及进制为 0
  4. 在循环内将节点值相加并操做 Node 变量指向下一个节点便可;

注:spa

  1. 为了加快算法速度,取整时我放弃了 parseInt,转而使用位运算 ~~
  2. 另外一种思路是先建立一个空头节点做为 result 链表 的头节点,全部相加的操做都放在循环中,最后返回 result.next 便可。这种方法能够 AC ,但因为多了一个空节点,在内存和性能上都稍差。

个人实现:3d

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
  const count = l1.val + l2.val
  let carry = ~~(count / 10)
  const result = new ListNode(count % 10)
  let currentNode1 = l1.next
  let currentNode2 = l2.next
  let currentNode3 = result
  while (currentNode1 || currentNode2 || carry) {
    let digit = carry
    if (currentNode1 && currentNode2) {
      digit += currentNode2.val + currentNode1.val
      currentNode1 = currentNode1.next
      currentNode2 = currentNode2.next
    } else if (currentNode1) {
      digit += currentNode1.val
      currentNode1 = currentNode1.next
    } else if (currentNode2) {
      digit += currentNode2.val
      currentNode2 = currentNode2.next
    }
    carry = ~~(digit / 10)
    currentNode3 = currentNode3.next = new ListNode(digit % 10)
  }
  return result
};

成绩指针

clipboard.png

clipboard.png

相关文章
相关标签/搜索