解题日期:20.08.23 链表
题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers
解
- 这个解蛮菜的,只战胜了18%的人哈哈哈,但是第一次挑战中等题,写下解题思路
一开始我不明白链表在这道题中指的是什么,概念知道了是存储指向下一个的地址,但是不知道在js中怎么表示,其实就相当于对象嵌套↓
ListNode {
val: 1,
next: ListNode {
val: 2,
next: {
val: 3,
next: null
}
}
}
搞明白这个概念后思考这个题,说起来很简单,就是每一位相加,如果大于10就进位。
- 实际操作相当于递归,每次处理的是 next 的对象,这个很妙的写法是从评论区看来的,利用一个 temp 作为中间媒介,每次拿result.next的引用,做到了循环时给嵌套赋值。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let result = new ListNode(null)
// 一定拷贝的是引用
let temp = result
let tenLoc = 0
while (l1 || l2 || tenLoc) {
if (l1) {
l1.val = l1.val ? l1.val : 0
} else {
l1 = {
val: 0,
next: null
}
}
if (l2) {
l2.val = l2.val ? l2.val : 0
} else {
l2 = {
val: 0,
next: null
}
}
temp.val = tenLoc + l1.val + l2.val
tenLoc = parseInt(temp.val / 10)
temp.val = temp.val % 10
l1 = l1.next
l2 = l2.next
if (l1 || l2 || tenLoc) {
temp.next = {}
} else {
temp.next = null
}
temp = temp.next
}
return result
};
错误思路存档
- 将链表转成数组,然后将数组倒转->join(),变成数字,对数字进行加减,最后转回链表
- 问题:js在超大整数计算时会出现精度丢失的问题,即 100000000000000000000+645 的输出结果是 100000000000000000000
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
function listNode2Array(l) {
let array = []
return function () {
array.push(l.val)
if (l.next) {
array = array.concat(listNode2Array(l.next)())
}
return array
}
}
function array2ListNode(arr) {
var result = {val: arr[0], next: {}}
arr.reduce(function (pre, current, currentIndex) {
pre.val = current
console.log(pre)
if(currentIndex === arr.length - 1) {
pre.next = null
} else {
pre.next = {}
return pre.next
}
}, result)
console.log(result)
return result
}
let addSum = parseInt(listNode2Array(l1)().reverse().join('')) + parseInt(listNode2Array(l2)().reverse().join('')) console.log(addSum)
let tempStr = ''
if (addSum.toString().match(/[^0-9]/)) {
tempStr = addSum.toLocaleString().replace(/,/g, '')
} else {
tempStr = addSum.toString()
}
return array2ListNode(tempStr.split('').reverse().map(item => +item))
};