链表 - 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
相关文章
相关标签/搜索