[路飞]_今夜加数字(一)

245 阅读1分钟

2. 两数相加

题目

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

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

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

示例1

image.png

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

解题思路

逆序排列,直接枚举两个链表,将两个链表值相加即可;考虑两数值相加大于9的情况;

假如变量sign表示两数值之和大于0;初始值为0;

举个例子:

链表1564
链表2708
sign100
结果2721
解释这里5+7+sign = 12 > 9
所以 sign设置为1
6 + sign + 0 = 6 < 9
sign 设置为0
8+4+sign = 12 > 9
所以sign设置为1
0 + 0 + sign = 1 < 9
所以sign设置为0

得到结果2721

将每一步计算出来的结果放进一个链表中即可得到答案

代码

var addTwoNumbers = function (l1, l2) {
  let root = new ListNode(-1)
  let list = root
  let sign = 0 //进位变量
  while (l1 || l2 || sign) {
    //保证l1.val有值
    if (!l1) {
      l1 = new ListNode(0)
    }
    //保证l2.val有值
    if (!l2) {
      l2 = new ListNode(0)
    }
    let n = l1.val + l2.val + sign
    if (n >= 10) {
      sign = 1
      n = n - 10
    } else {
      sign = 0
    }
    list.next = new ListNode(n)
    l1 = l1.next
    l2 = l2.next
    list = list.next
  }
  return root.next
}