原题:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
心路历程:
首先此题并不是给你数组或者listnode这种类数组让你输出一个数组,listnode是题中自己定义的一个构造函数,输入和输出均为listnode类型,这个审题注意
此题不用考虑所谓的暴力解法,比如先转换成数组形式然后调用reverse函数最后通过两个数字相加得出结论,测试用例会用各种方式搞你,比如给你[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] [5,4,3]这两个参数,直接相加会引发js的精度问题(变为1e+24的形式)导致结果不正确
3.结论如下
var addTwoNumbers = function(l1, l2) {
let sum = 0 //记录当前位数的和
let result = {} //结果
let cur = result //当前正在修改的部分
while(l1 || l2 || sum) {//此处的三个判断条件,l1,l2是否存在很好理解,判断sum是否存在是为了判断是否需要进位比如[4,5,6] [7,8,9] => [1,4,6,1]的情况
sum += (l1 && l1.val) + (l2 && l2.val) // 很好理解,l1与l2相加取和
cur = cur.next = new ListNode(sum % 10) // 修改当前部分的next属性,构造出一个新的listnode数据类型(他的val属性为sum与10的取余,因为超出10的话会进位,这里保留个位数,next属性为null)
l1 = l1 && l1.next //重新定义l1为下一次迭代做准备
l2 = l2 && l2.next //重新定义l2为下一次迭代做准备
sum = Math.floor(sum / 10) //这里sum只会是0和1代表是否进位,如果是1则下一次迭代中sum初始值为1,体现进位
}
return result.next //返回结果
};