[路飞]_leetcode-2-两数相加

300 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

[题目地址] [B站地址]

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

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

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

解题思路如下:

  1. 创建虚拟头节点用来返回结果链表
  2. 创建 num 变量记录之前节点的和值的进位数值
  3. 当传入链表至少一个不为空的时候,遍历链表,得到当前循环的和值 sum = (l1?li.val:0) + (l2?l2.val:0) + num
  4. 根据 sum 创建下一个节点 `new ListNode(sum%10)
  5. 记录进位数值 num = Math.floor(sum/10)
  6. 将结果链表、l1l2 走向后走一位(如果某个链表为空,则指向 null
  7. 当两个链表都为空后,判断此时进位数值是否不为零,如果不为零,则根据进位数值节点连接到结果链表末尾
  8. 返回结果链表的头节点

说明: 根据题意可知链表节点的值为 0~9,则 sum 的值为 0~18,所以 num01

代码如下:

var addTwoNumbers = function(l1, l2) {
  const vhead = new ListNode(0);
  let num = 0,
  cur = vhead;
  while(l1||l2){
    const sum = (l1?l1.val:0)+(l2?l2.val:0)+num;
    cur.next = new ListNode(sum%10)
    num = Math.floor(sum/10);
    cur = cur.next;
    l1 = l1?l1.next:null;
    l2 = l2?l2.next:null;
  }
  if(num) cur.next = new ListNode(num);
  return vhead.next;
};

至此我们就完成了 leetcode-2-两数相加

如有任何问题或建议,欢迎留言讨论!