【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

相關文章
相關標籤/搜索