初级算法练习第十七节

108 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

1. 引言

接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…

2. 题型

1.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

image

示例1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100]0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

思路:
首先定义一个数组args用来存储对应的位置相加的结果;第一步先把两个长度不同的链表加起来,并且不考虑进位,每一项对应相加,如果当前两个链表对应项为空则赋予默认值0,相加的结果记录到args 数组中; 第二步,获取到记录args 数组这时候循环每一项值,开始进位:当值大于9时,且并不会超过(9+9+1=19),该项缩小10,后一项进位;如果后一项不存在默认赋值为1; 第三步,把记录进位后的记录数组args 通过递归的方式转换成链表,从数组第一项开始转换为链表对应项,通过shift移出栈顶,接着递归下一项直至结束。

解答:


/**
 * 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) {
    var l1Node = l1
    var l2Node = l2
    var args = [] // 存储对应的位置相加的结果
    var needAdd1 = 0
    // 先不考虑进位,对应的链表每一位相加
    while(l1Node||l2Node) {
        // 考虑两个链表长度不同的情况
        // var val1 = l1Node && l1Node.val || 0
        // var val2 = l2Node && l2Node.val || 0
        var val1 = l1Node ? l1Node.val : 0
        var val2 = l2Node ? l2Node.val : 0
        var temp = val1 + val2
        args.push(temp)
        l1Node && (l1Node = l1Node.next)
        l2Node && (l2Node = l2Node.next)
    }
    // 考虑进位的问题
    for (let i = 0; i < args.length; i++) {
        if(args[i] > 9) {
            args[i] -= 10
            if (args[i+1] === undefined) {
                args[i+1] = 1
            } else {
                args[i+1] += 1
            }
        }
    }
    // 把数组转成成链表(递归)
    function createList (...argu) {
         if (argu.length > 0) {
                var nodeStart = new ListNode(argu[0])
                argu.shift()
                nodeStart.next = createList(...argu)
                return nodeStart
            } else {
                return null
            }
    }
    
    return createList(...args)
};