两个数相加

132 阅读1分钟

两个数相加

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

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

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

输入: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
  • 题目数据保证列表表示的数字不含前导零
/**
 * 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) {
  
};

首先我们先说下链表,我们都很熟悉。我们现在要创建链表:

我们知道链表是这样制造出来的:

var a = new ListNode(3);
var b = new ListNode(4,a);
var c = new ListNode(2,b);
var l1 = c;
​
var d = new ListNode(4);
var e = new ListNode(6,d);
var f = new ListNode(5,e);
var l2 = f;

我们也可以通过传入数组来实现

方法1: 倒序传入

function makeList1(arr) {
  let list = null;
  arr.forEach(item => {
    if(!list) list = new ListNode(item);
    else list = new ListNode(item,list);
  }) 
  return list;
}
console.log(makeList1([3, 4, 2]))

方法二:正序传入

function makeList2(arr) {
  let list = null;
  list.forEach(item => {
    if(!list) {
      list = tail = new ListNode(item);
    } else {
      tail.next = new ListNode(item);
      tail = tail.next;
    }
  })
  return list;
}
console.log(makeList2([2, 4, 3]))

题解:

var addTwoNumbers = function(l1, l2) {
  if(!l1 && !l2) return null;
  // 链表头
  var head = null,
  // 当前链表位置
  tail = null;
  // 存放当前计算的数值
  sum = 0,
  // 存放进位
  var remainder = 0;
  
  while(l1 || l2) {
    let n1 = l1 ? l1.val : 0;
    let n2 = l2 ? l2.val : 0;
    // 计算
    sum = n1 + n2 + remainder;
    // 计算进位
    remainder = Math.floor(sum / 10);
    // 存入计算的值
    if(!head) {
      //如果没有链表头,我们开始创建
      head = tail = new ListNode(sum % 10);
    } else {
      // 链表向下链接
      tail.next = new ListNode(sum % 10);
      // 更新链表位置(指针++)
      tail = tail.next;
    }
    // 更新链表位置(指针++)
    if(l1) {
      l1 = l1.next;
    }
    if(l2) {
      l2 = l2.next;
    }
  }
  // 存在进位 则链表下一项进一位
  if (remainder) tail.next = new ListNode(1)
  return head
};