最近小组的一位同学在LeeCode上的一道题犯愁了,最后一起研讨了下,终于解决了,发现在力扣上出错率还挺高,给大家分享一下:
1,题目截图:
2,涉及知识点
a: 链式结构 =》 ListNode格式 { val: 1, next: { val: 1, next: {val: 2, next: null }}}
b: 大数求和, 不采用科学计数法,最后可用于数组或者字符串显示
c:递归 =》 链式结构转数组, 数组转对应的链式结构
3, 解题方案(具体代码在图片正下方) ![](https://i-blog.csdnimg.cn/blog_migrate/a1356c956f4ee95167b54968cbdf8a78.png)
4, 代码展示
/**
* 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}
*/
// ListNode格式 { val: 1, next: { val: 1, next: {val: 2, next: null }}}
// 获取ListNode中val形成新的数组
const getValArray = (obj, arr = []) => {
arr.push(obj.val || 0)
if (obj.next) {
getValArray(obj.next, arr)
}
return arr
}
// 将数组转化为ListNode格式
const getResultObj = (arr = []) => {
return {
val: arr[0] || 0,
next: arr.length > 1 ? getResultObj(arr.splice(1)) : null
}
}
// 改变数组长度, 用0填充,便于不同长度两数相加
const padZero = (a1, a2) => {
const maxLength = Math.max(a1.length, a2.length)
let newArray
const solve = (arr) => {
return arr.join('').padStart(maxLength, 0).split('')
}
if (a1.length === maxLength) {
newArray = [a1, solve(a2)]
} else {
newArray = [solve(a1), a2]
}
return newArray
}
// 大数相加
const bigNumberSum = (arr) => {
const a1 = arr[0], a2 = arr[1], length = a1.length
let result = [], flg = 0, sum = 0
for(let i = length - 1; i >= 0; i--) {
const num1 = Number(a1[i]) || 0
const num2 = Number(a2[i]) || 0
sum = num1 + num2 + flg
if (sum >= 10) {
sum = sum % 10
flg = 1
} else {
flg = 0
}
result.unshift(sum)
if (i === 0 && flg) {
result.unshift(1)
}
}
return result.reverse()
}
// 结果值
const addTwoNumbers = (l1, l2) => {
const arr1 = getValArray(l1).reverse()
const arr2 = getValArray(l2).reverse()
return getResultObj(bigNumberSum(padZero(arr1, arr2)))
}