给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
链接:https://leetcode-cn.com/problems/add-two-numbers
输入:[2,4,3] , [5,6,4]
输出: [7,0,8]
我的解法:
/**
* 构造链表数据结构
*/
function ListNode (val) {
this.val = val
this.next = null
}
/*
* 获取链表长度
* @param {ListNode} listNode类型数据
*/
function getLength (ListNode) {
let len = 0
let temp = ListNode
while(temp) {
len++
temp = temp.next
}
return len
}
/*
* listNode转化为数组
* @param {ListNode}
* @return Array
*/
function listNodeToArr (ListNode) {
const arr = []
let next = ListNode
while (next) {
arr.push(next.val)
next = next.next
}
return arr
}
/*
* 递归调用产生listNode 格式
* @param Array|Number
* @return {ListNode}
*/
function generatelistNode (arr) {
if(!arr.length) return null
let node = new ListNode(arr.shift())
node.next = generatelistNode(arr)
return node
}
function addTwoNumbers (l1, l2) {
if (!l1 || !l2) return l1 ? l2 : l1
// 获取里两个链表对应长度,对短链表末位补零
const len1 = getLength(l1)
const len2 = getLength(l2)
let l1Arr, l2Arr
if (len1 !== len2) {
// 需要补的位数
let degits = Math.abs(len1 - len2)
// 构造出需要补位的数据
// ListNode 转数组,再转会listNode
l1Arr = len1 > len2 ? listNodeToArr(l1) : listNodeToArr(l1).concat(Array(degits).fill(0))
l2Arr = len1 > len2 ? listNodeToArr(l2).concat(Array(degits).fill(0)) : listNodeToArr(l2)
} else {
l1Arr = listNodeToArr(l1)
l2Arr = listNodeToArr(l2)
}
console.log('l1Arr, l2Arr ---', l1Arr, l2Arr)
// 拿到连个等长的数组,开始逐一相加,产生进位,向后加一 (因为是逆序)
const result = []
let carry = 0
let l1ArrFirst = l1Arr.shift() // 每次取数组第一位
let l2ArrFirst = l2Arr.shift()
while (l1ArrFirst !== undefined || l2ArrFirst !== undefined || carry) {
const sum = (l1ArrFirst || 0) + (l2ArrFirst || 0) + carry
if (sum >= 10) {
carry = 1
result.push(sum % 10)
} else {
carry = 0
result.push(sum)
}
l1ArrFirst = l1Arr.length ? l1Arr.shift() : undefined// 每次取数组第一位
l2ArrFirst = l2Arr.length ? l2Arr.shift() : undefined
}
// 拿到倒序的数组,构造成listNode链表格式
// console.log('result ---', result, Array.isArray(result))
const final = generatelistNode(result)
// console.log('最终链表是:', final)
return final
}
// 构造数据
const l1 = new ListNode(2)
const l1x = new ListNode(4)
const l1y = new ListNode(3)
const l1z = new ListNode(5)
l1.next = l1x
l1x.next = l1y
l1y.next = l1z
const l2 = new ListNode(5)
const l2x = new ListNode(6)
const l2y = new ListNode(4)
l2.next = l2x
l2x.next = l2y
addTwoNumbers(l1, l2)
去掉链表补齐的操作后
优秀答案:
/**
* 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) {
let addOne = 0
let sum = new ListNode('0')
let head = sum
while (addOne || l1 || l2) {
let val1 = l1 !== null ? l1.val : 0
let val2 = l2 !== null ? l2.val : 0
let r1 = val1 + val2 + addOne
addOne = r1 >= 10 ? 1 : 0
sum.next = new ListNode(r1 % 10)
sum = sum.next
if (l1) l1 = l1.next
if (l2) l2 = l2.next
}
return head.next
};
作者:afeng-xiu
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-ge-shu-xiang-jia-zui-rong-yi-li-jie-de-jie-f/