2. 两数相加

题目

2. 两数相加

给你两个  非空 的链表,表示两个非负的整数。它们每位数字都是按照  逆序  的方式存储的,并且每个节点只能存储  一位  数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

思路

首先看懂题目

两个链表,分别将十进制数字在链表中逆序排列,链表每个节点是一个一位数,十进制的数字不以 0 开头.

解题思路:

  • 迭代链表,从链表头部开始,正好是个位数,同时迭代两条链表

  • 考虑一条链表迭代完,另外一条还在继续迭代中

  • 考虑逢十进一

  • 考虑最高位进一

代码

1. 循环

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  let head = null;
  let tail = null;

  let carry = 0;

  while (l1 || l2) {
    let n1 = l1 ? l1.val : 0;
    let n2 = l2 ? l2.val : 0;
    let sum = n1 + n2 + carry;

    // 构造一个新的链表
    if (!head) {
      head = new NodeList(sum % 10);
    } else {
      tail.next = new NodeList(sum % 10);
      tail = tail.next;
    }

    if (l1) {
      l1 = l1.next;
    }
    if (l2) {
      l2 = l2.next;
    }

    // 十进制加法:逢十进一
    carry = Math.floor(sum / 10);
  }

  // 处理最高位逢十进一的问题
  if (carry) {
    tail.next = new ListNode(carry);
  }

  return head;
};

2. 递归

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  let carry = 0;

  let dfs = (l1, l2, carry) => {
    let n1 = l1 ? l1.val : 0;
    let n2 = l2 ? l2.val : 0;
    let next1 = l1 ? l1.next : null;
    let next2 = l2 ? l2.next : null;
    let sum = n1 + n2 + carry;
    if (l1 === null && l2 === null && carry === 0) {
      return null;
    }
    let head = new ListNode(sum % 10);
    head.next = dfs(next1, next2, Math.floor(sum / 10));

    return head;
  };

  return dfs(l1, l2, carry);
};