LeetCode两数相加

news2024/11/26 21:28:48

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

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

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

示例 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]

解题思路
(2->4->3)+(5->6->4) = (7->0->8),根据加法的计算过程我们知道首先从低位开始算起,也就是说应该先计算2+5=7

1、首先取出“+”左右两边两个数的最低位,也就是

let val1 = l1.val
let val2 = l2.val

注意:因为LeetCode定义了一个单链表节点 ListNode 的结构。它不是一个实际的执行代码,而是提供了链表节点的构造函数定义,这样你就可以根据这个结构来创建链表节点。

   function ListNode(val, next) {
       this.val = (val===undefined ? 0 : val)
       this.next = (next===undefined ? null : next)
    }

**val:节点存储的值,默认为 0(如果未提供,则使用 undefined)。
**next:**指向下一个节点的引用,默认为 null(如果未提供,则使用 undefined)。

例如,如果你有一个链表 1 -> 2 -> 3,并且 l1 是指向头节点的引用,那么执行 let val1 = l1.val 后,val1 的值将会是 1。

2、其次求出他们的和并作为输出结果的最低位(由于输出的结果是链表的形式保存,所以我们应该写成这种形式)

let sum = new ListNode('0')
sum.next = new ListNode(“结果” % 10)//之所以要“结果” % 10是因为我们的计算结果是有可能大于10的,所以需要取余

所以初步的代码如下:

var addTwoNumbers = function(l1, l2) {
    let sum = new ListNode('0') // 创建一个头链表用于保存结果
    let head = sum // 保存头链表的位置用于最后的链表返回
    while (l1 || l2) {//在两个链表之中有一个存在的前提下执行下面的逻辑
        let val1 = l1.val
        let val2 = l2.val
        let r1 = val1 + val2     //求和
        sum.next = new ListNode(r1 % 10)          //sum的下一个节点
        sum = sum.next          //sum指向下一个节点
       if (l1) l1 = l1.next            //l1指向下一个节点,以便计算第二个节点的值
        if(l2) l2 = l2.next          //l2指向下一个节点,以便计算第二个节点的值
    }
    return head.next            //返回计算结果,之所以用head.next是因为head中保存的第一个节点是刚开始定义的“0”
};

考虑将进位加入代码中

    let addOne = 0 //进位
    let sum = new ListNode('0')
    let head = sum
    while (addOne || l1 || l2) {//在进位或者两个链表之中有一个存在的前提下执行下面的逻辑
        let val1 = l1.val
        let val2 = l2.val
        let r1 = val1 + val2 + addOne//求和
        addOne = r1 >= 10 ? 1 : 0 // 如果求和结果>=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
};

当我们提交的时候并不能通过所有的案例,不能通过的一个案例为:[9999]与[99]相加,这是因为l1与l2相加的过程中,当指针指向第三个9的时候l1的9是存在的而l2的9是不存在的,也就是为null,所以无法相加会进行报错,所以我们需要进行一步优化,如果值不存在时,将其设置为0,然后再进行相加即可,完成代码如下:

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
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA JUC学习笔记

基础知识 1、进程和线程的对比 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集进程拥有共享的资源,如内存空间等,供其内部的线程共享进程间通信较为复杂 同一台计算机的进程通信称为 IPC(Inter-process …

前端面试 vue 按钮级的权限控制

方案一 按钮权限也可以用v-if判断 但是如果页面过多,每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions,然后再做判断 这种方式就不展开举例了 方案二 使用自定义指令实现 按钮级的权限控制 思维导图 心就是自定义指令的书写 首先…

exo 大模型算力共享;Llama3-70B是什么

目录 exo 大模型算力共享 exo框架的特点 如何使用exo框架 注意事项 结论 Llama3-70B是什么 一、基本信息 二、技术特点 三、性能与应用 四、未来发展 exo 大模型算力共享 exo框架的特点 异构支持:支持多种不同类型的设备,包括智能手机、平板电脑、笔记本电脑以及高…

Java 集合框架:Java 中的双端队列 ArrayDeque 的实现

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 019 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

AI多模态实战教程:面壁智能MiniCPM-V多模态大模型问答交互、llama.cpp模型量化和推理

一、项目简介 MiniCPM-V 系列是专为视觉-语⾔理解设计的多模态⼤型语⾔模型(MLLMs),提供⾼质量的⽂本输出,已发布4个版本。 1.1 主要模型及特性 (1)MiniCPM-Llama3-V 2.5: 参数规模: 8B性能…

初学Linux之常见指令(下)

初学Linux之常见指令(下) 文章目录 初学Linux之常见指令(下)1. echo 指令2. cat 指令3. more 指令4. less 指令5. head 和 tail 指令6. date 指令7. cal 指令8. which 指令9. alias 指令10. find 指令11. grep 指令12. zip 和 unz…

C++中如何高效拼接两个vector

在C编程中,vector是一种常用的数据结构,它代表了一个可以动态改变大小的数组。在实际开发中,经常需要将两个vector拼接在一起,形成一个新的vector。本文将详细介绍如何在C中拼接两个vector,并探讨不同方法的性能差异。…

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件,这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本,这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

PMP--知识卡片--敏捷方法

文章目录 敏捷方法,是一种新型软件开发方法。不要求遵循传统的软件开发流程,强调快速开发和有效适应需求变化,典型代表如看板、Scrumban、极限编程、测试驱动开发等。 区别于传统项目场景,敏捷项目场景强调交互协作、尊重个体、面…

Linux系统快速搭建轻量化网站Halo并实现无公网IP远程访问

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

无价之美:大麗和和品牌美学概念宣传片发布

高级珠宝品牌大麗和和筹备6个月,隆重发布《无价之美》品牌美学概念宣传片。品牌创始人牟童女士携珍贵藏品,亲诉美与传承的故事。 “尊尚正美” 珍稀宝石的颜色,是以色正为美。“正”就是事物极致的样子。最受人追慕的翡翠被称为“帝王绿”&a…

drawio更改默认字体大小(暂时有问题,修改中)

PS:其他的也可以在这里修改对应的值

Docker无法拉取镜像!如何解决?

问题现象 继去年Docker Hub被xxx后,各大NAS的注册表均出现问题,例如群晖的Docker套件注册表无法连接(更新至DSM7.2版本后恢复)。而在今年2024年6月初(约2024.06.06),NAS中最重要的工具Docker又…

解决git拉取代码报错:Couldn‘t connect to server

前言: 今天在拉取git仓库代码的时候,报错:fatal: unable to access https://codeup.aliyun.com/fly/business-project/lezhi-HR.git/: Failed to connect to 127.0.0.1 port 8020 after 2082 ms: Couldnt connect to server 错误截图&#…

mysql中的索引和分区

目录 1.编写目的 2.索引 2.1 创建方法 2.2 最佳适用 2.3 索引相关语句 3.分区 3.1 创建方法 3.2 最佳适用 Welcome to Code Blocks blog 本篇文章主要介绍了 [Mysql中的分区和索引] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 1.编写目的 在MySQL中&…

函数调用过程

生成机器码.o文件,使用objdump - d -M intel hello_func.o来看汇编代码 栈内存由于历史原因看作是从高地址往低地址扩张所以栈底为高地址,栈顶为低地址。 rbp存储的时当前栈帧的基地址,栈底地址。 rsp存储的是栈顶地址,rip存储…

【计算机网络】TCP/IP——流量控制与拥塞控制

学习日期:2024.7.22 内容摘要:TCP的流量控制与拥塞控制 流量控制 一般来说,我们总是希望数据传输的快一些,但是如果数据传输的太快,接收方可能就来不及接收,这就会导致数据的丢失,流量控制正是…

【代码随想录】【算法训练营】【第58天 4】 [卡码104]建造最大岛屿

前言 思路及算法思维,指路 代码随想录。 题目来自 卡码网。 day 58,周四,ding~ 题目详情 [卡码104] 建造最大岛屿 题目描述 卡码104 建造最大岛屿 LeetCode类似题目827 最大人工岛 解题思路 前提: 思路: 重点…

压缩pdf大小的方法 指定大小软件且清晰

在数字化时代,pdf文件因其良好的兼容性和稳定性,已成为文档分享的主流格式。然而,高版本的pdf文件往往体积较大,传输和存储都相对困难。本文将为您详细介绍几种简单有效的方法,帮助您减小pdf文件的大小,让您…

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线 1、系统功能介绍2、演示视频3、系统框图4、系统电路介绍4.1、STM32单片机最小系统设计4.2、按键电路设计4.3、蜂鸣器报警电路设计4.4、Pulsesensor脉搏心率传感器模块电路设计 5、程序设计5.1、LCD TFT屏幕初始化5.2、TFT屏幕显…