×

原题链接

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

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

你可以假设除了数字 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
  • 题目数据保证列表表示的数字不含前导零

答案:

var addTwoNumbers = function(l1, l2) {
  let item = {}
  let final = item
  let a = 0
  while (l1 || l2 || a) {
      let l = l1?.val ?? 0
      let r = l2?.val ?? 0
      a += (l + r)
      l1 = l1?.next
      l2 = l2?.next
      item.next = {val: a%10, next: null}
      a = ~~(a / 10)
      item = item.next
  }
  return final.next
};

解题过程

  1. 创建一个空的对象item,作为链表的第一个节点
  2. 存储初始item的引用为final,作为链表的头节点,用于最后返回结果
  3. 创建一个变量a,用来记录上一次运算结果是否超出了10,如果超出需要在下一组节点计算的时候 + 1作为进位
  4. 使用while遍历链表,只要满足三个条件中的一个,l1还有节点/l2还有节点/a也就是上一次计算超过了10,满足这三个中的一个就继续进行计算
  5. 对l1和l2进行规范化处理,如果没有值就给个默认值0,用来处理两个链表长度不一致,或者两个链表一致但是最后一位相加超过了10的情况
  6. 计算 l1 + l2 + a(上一轮是否大于10),给新节点赋值结果%10,也就是保留一位数,给a赋值结果是否大于10,给两个链表赋值next节点,给item赋值下一个节点
  7. 循环到结束即可

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

138368895@qq.com

相关文章

1.两数之和

原题链接 给定一个整数数组 num...

读出全部