携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
1. 引言
接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…
2. 题型
1.两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
题目数据保证列表表示的数字不含前导零
思路:
首先定义一个数组args用来存储对应的位置相加的结果;第一步先把两个长度不同的链表加起来,并且不考虑进位,每一项对应相加,如果当前两个链表对应项为空则赋予默认值0,相加的结果记录到args 数组中;
第二步,获取到记录args 数组这时候循环每一项值,开始进位:当值大于9时,且并不会超过(9+9+1=19),该项缩小10,后一项进位;如果后一项不存在默认赋值为1;
第三步,把记录进位后的记录数组args 通过递归的方式转换成链表,从数组第一项开始转换为链表对应项,通过shift移出栈顶,接着递归下一项直至结束。
解答:
/**
* 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 l1Node = l1
var l2Node = l2
var args = [] // 存储对应的位置相加的结果
var needAdd1 = 0
// 先不考虑进位,对应的链表每一位相加
while(l1Node||l2Node) {
// 考虑两个链表长度不同的情况
// var val1 = l1Node && l1Node.val || 0
// var val2 = l2Node && l2Node.val || 0
var val1 = l1Node ? l1Node.val : 0
var val2 = l2Node ? l2Node.val : 0
var temp = val1 + val2
args.push(temp)
l1Node && (l1Node = l1Node.next)
l2Node && (l2Node = l2Node.next)
}
// 考虑进位的问题
for (let i = 0; i < args.length; i++) {
if(args[i] > 9) {
args[i] -= 10
if (args[i+1] === undefined) {
args[i+1] = 1
} else {
args[i+1] += 1
}
}
}
// 把数组转成成链表(递归)
function createList (...argu) {
if (argu.length > 0) {
var nodeStart = new ListNode(argu[0])
argu.shift()
nodeStart.next = createList(...argu)
return nodeStart
} else {
return null
}
}
return createList(...args)
};