给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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 = valthis.next = null}/** 获取链表长度* @param {ListNode} listNode类型数据*/function getLength (ListNode) {let len = 0let temp = ListNodewhile(temp) {len++temp = temp.next}return len}/** listNode转化为数组* @param {ListNode}* @return Array*/function listNodeToArr (ListNode) {const arr = []let next = ListNodewhile (next) {arr.push(next.val)next = next.next}return arr}/** 递归调用产生listNode 格式* @param Array|Number* @return {ListNode}*/function generatelistNode (arr) {if(!arr.length) return nulllet 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, l2Arrif (len1 !== len2) {// 需要补的位数let degits = Math.abs(len1 - len2)// 构造出需要补位的数据// ListNode 转数组,再转会listNodel1Arr = 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 = 0let l1ArrFirst = l1Arr.shift() // 每次取数组第一位let l2ArrFirst = l2Arr.shift()while (l1ArrFirst !== undefined || l2ArrFirst !== undefined || carry) {const sum = (l1ArrFirst || 0) + (l2ArrFirst || 0) + carryif (sum >= 10) {carry = 1result.push(sum % 10)} else {carry = 0result.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 = l1xl1x.next = l1yl1y.next = l1zconst l2 = new ListNode(5)const l2x = new ListNode(6)const l2y = new ListNode(4)l2.next = l2xl2x.next = l2yaddTwoNumbers(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 = 0let sum = new ListNode('0')let head = sumwhile (addOne || l1 || l2) {let val1 = l1 !== null ? l1.val : 0let val2 = l2 !== null ? l2.val : 0let r1 = val1 + val2 + addOneaddOne = r1 >= 10 ? 1 : 0sum.next = new ListNode(r1 % 10)sum = sum.nextif (l1) l1 = l1.nextif (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/
