LeetCode2 - 两数相加(Add Two Numbers)

292 阅读2分钟

中文:leetcode-cn.com/problems/ad…

英文:leetcode.com/problems/ad…

题目描述

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

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

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

示例:

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

题解

image

首先每一位相加肯定会产生进位,我们用 carry 表示。进位最大会是 1 ,因为最大的情况是无非是 9 + 9 + 1 = 19 ,也就是两个最大的数相加,再加进位,这样最大是 19 ,不会产生进位 2 。

/**
 * 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) {
  // 给 p 和 q 分别赋值为给定的两个链表 l1 和 l2 的头,也就是个位
  let p = l1
  let q = l2
  // 初始化进位 carry 为 0 
  let carry = 0
  // 初始化一个节点的头,dummy head ,但是这个头不存储数字。并且将 curr 指向它
  const dummyHead = new ListNode()
  let curr = dummyHead
  // 循环,直到 p 和 q 全部为 null,退出循环
  while (p || q) {
    // 设置 x 为 p 节点的值,如果 p 是 null,设置 x 为 0 
    // 设置 y 为 q 节点的值,如果 q 是 null,设置 y 为 0 
    const x = p ? p.val : 0
    const y = q ? q.val : 0
    // 设置 sum = x + y + carry 
    const sum = x + y + carry
    // 更新 carry = sum / 10 
    carry = Math.floor(sum / 10)
    // 创建一个值为 sum 模 10 的节点,并将 curr 的 next 指向它,同时 curr 指向变为当前的新节点
    curr.next = new ListNode(sum % 10);
    curr = curr.next;
    // 向前移动 p 和 q 
    if (p) p = p.next
    if (q) q = q.next
  }
  // 判断 carry 是否等于 1 ,如果等于 1 ,在链表末尾增加一个为 1 的节点
  if (carry > 0) {
    curr.next = new ListNode(carry);
  }
  // 返回 dummy head 的 next ,也就是个位数开始的地方
  return dummyHead.next
};

function ListNode(val) {
  this.val = val;
  this.next = null;
}
// [2,4,3]
// [5,6,4]
let l1 = new ListNode(2)
l1.next = new ListNode(4)
l1.next.next = new ListNode(3)
l1.next.next.next = null
let l2 = new ListNode(5)
l2.next = new ListNode(6)
l2.next.next = new ListNode(4)
l2.next.next.next = null
console.log(addTwoNumbers(l1, l2))