鏈表 - Add Two Numbers[LeetCode]

image.png
不用截圖的示例,比較容易混淆。採用下面代碼的例子便可。 leetcode-cn.com/problems/ad…

1、逆序存儲

由於有說明位數是按照逆序的方式來存儲,因此直接遍歷,而後再相加,獲得的新鏈表,就是最終的結果。node

// 輸入:(1 -> 4 -> 2) + (7 -> 6 -> 4) -- 從左到右:個位/十位/百位
// 輸出:8 -> 0 -> 7
// 緣由:241 + 467 = 708
複製代碼
// 前提
function ListNode(val) {
  this.val = val;
  this.next = null;
}
// 建立兩個鏈表用於測試
var list11 = new ListNode(1);
list11.next = new ListNode(4);
list11.next.next = new ListNode(2);
var list22 = new ListNode(7);
list22.next = new ListNode(6);
list22.next.next = new ListNode(4);

// 參考官網例子 https://leetcode.com/problems/add-two-numbers/solution/
var addTwoNumbers = function(l1, l2) {
  var dummyHead = new ListNode(0);
  var p = l1,
    q = l2,
    curr = dummyHead;
  var carry = 0;
  while (p != null || q != null) {
    var x = (p != null) ? p.val : 0;
    var y = (q != null) ? q.val : 0;
    var sum = carry + x + y;
    // 須要對進位取整
    carry = Math.floor(sum / 10);
    curr.next = new ListNode(sum % 10);
    curr = curr.next;
    if (p != null) p = p.next;
    if (q != null) q = q.next;
  }
  if (carry > 0) {
    curr.next = new ListNode(carry);
  }
  return dummyHead.next;
}
console.log(addTwoNumbers(list11, list22)); // 8->0->7
複製代碼

注意點:bash

  1. 位數按照逆序存儲,即鏈表第一位是個位,第二位是十位,以此類推。
  2. 1(個位)->4(十位)->2(百位) + 7(個位)->6(十位)->4(百位) = 8(個位)->0(十位)->7(百位)
  3. 241 + 467 = 708

2、擴展:若是鏈表中的數字不是按逆序存儲的呢?

不按逆序存在,那鏈表的最後一位是個位,倒數第二位是十位,以此類推。以下所示:測試

// 輸入:(1 -> 4 -> 2) + (7 -> 6 -> 4)
// 輸出:9 -> 0 -> 6
// 緣由:142 + 764 = 906
複製代碼

我想到的一個方式是,先反轉鏈表,再相加,而後把結果再反轉:ui

var reverseLList = function(node) {
  // 建立一個頭部節點
  var headNode = new ListNode(0);
  var end = 0;
  while (!end) {
    var newlist = new ListNode(node.val);
    // 新節點指向頭部節點的next
    newlist.next = headNode.next;
    // 而後頭部節點指向新節點,這樣當前添加的節點總會在head後面,從而反轉鏈表
    headNode.next = newlist;
    if (node.next == null) { // 標識是否最後一個節點
      end = 1;
    }
    node = node.next;
  }
  return headNode.next;
}
console.log(reverseLList(addTwoNumbers(reverseLList(list11), reverseLList(list22))));
// 9->0->6
複製代碼

注意點:this

  1. 位數不按逆序存儲,則鏈表最後一位是個位,倒數第二位是十位,以此類推。
  2. 1(百位)->4(十位)->2(個位) + 7(百位)->6(十位)->4(個位) = 9(百位)->0(十位)->6(百位)
  3. 142 + 764 = 906
相關文章
相關標籤/搜索