【LeetCode刷题】2两数相加

news2024/9/30 13:32:21

2. 两数相加

JAVA代码

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

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

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

示例 1:

img

输入: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
  • 题目数据保证列表表示的数字不含前导零

方法一:模拟

初等数学

  • 我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。
  • 对两数相加方法的可视化:342+465 = 807,每个结点都包含一个数字,并且数字按位逆序存储。

复杂度分析

  • 时间复杂度:O(max(m,n)),假设m和n分别表示 1 1 1_1 11 1 2 1_2 12的长度,上面的算法最多重复max(m,n)次
  • 空间复杂度:O(max(m, n)),新列表的长度最多为max(m,n) + 1
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

这里leetcode直接给出了链表定义方式,自己写千万知道咋写。这边给出了多种构造方法,方便使用。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0; //进位
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }
}

这边看下代码,这是官网给出的答案。
在方法中,首先定义了一个ListNode head和ListNode tail,定义进位为carry=0。
当l1和l2有一个不为空时,进行循环遍历,当l1不为空的时候,将l1的值赋给n1,如果为空的话,则给n1赋0,n1就是当前指针指向的值,同理,对于l2也定义一个n2,用来存放当前指针指向的值。sum就是加的和。这里为什么加上进位?例子342+465 = 807,当我们进行4+6=10,有一个进位carry=1,这个1需要加给下一个指针指向的值。
如果head为空,则将head和tail都赋值为当前加的和sum;否则,就将当前的sun存入到尾指针中,尾指针在指向下一个。进位为sum的十位上的数,通过整除10获得;如果l1和l2不为空,指针就接着指向下一个。如此循环,直到循环当前l1和l2都为空结束循环。
如果最后的进位carry大于0,想象一下56+53=109,指针逆着算,5+5是有进位的,此时,再加个尾指针,值为进位carry。
最后返回头指针head。
下面按代码进行了简单走一遍,方便理解。
在这里插入图片描述

方法二:添加初始值0

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode current = dummyHead;
        int carry = 0;

        while (l1 != null || l2 != null) {
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;
            int sum = x + y + carry;
            carry = sum / 10; // 计算进位
            current.next = new ListNode(sum % 10);
            current = current.next;

            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }

        if (carry > 0) {
            current.next = new ListNode(carry);
        }
        return dummyHead.next;
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);

        Solution s = new Solution();
        ListNode result = s.addTwoNumbers(l1, l2);
        System.out.println(result.next.next.val);
        System.out.println(result.next.val);
        System.out.println(result.val);
    }
}

在这里插入图片描述

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

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

相关文章

MAC-设置mysql开机自启动

mac 设置mysql开机自启动 - MoonyHee - 博客园

学习网络编程No.8【应用层协议之HTTP】

引言&#xff1a; 北京时间&#xff1a;2023/10/9/13:03&#xff0c;一晃好多天过去了&#xff0c;9月14号的文章终于在昨天发出去了&#xff0c;也是许久没有更文了&#xff0c;国庆放假期间由于各种原因&#xff0c;在王者峡谷和铲子世界遨游的不亦乐乎&#xff0c;有待改善…

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下&#xff0c;方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

Node编写获取用户信息接口

目录 前言 初始化路由模块 使用postman发送get获取用户信息请求 初始化路由处理函数模块 获取用户基本信息 前言 在前两篇文章中已经介绍了如何编写用户注册接口以及用户登录接口&#xff0c;这篇文章介绍如何获取用户信息&#xff0c;本篇文章建立在Node编写用户登录接口…

国民技术N32G031 keil开发环境搭建

国民技术N32G031 keil开发环境搭建 目录 国民技术N32G031 keil开发环境搭建1 keil uVison5安装2 安装N32G031的pack包3 JLink添加Device&#xff08;非必须&#xff09;结束语 1 keil uVison5安装 这个网上的教程大把&#xff0c;我这里就不说了&#xff0c;同学们自行下载安装…

图像压缩(2)《数字图像处理》第八章 8.1节 基础知识

图像压缩&#xff08;1&#xff09;《数字图像处理》第八章8.1节基础知识 一. 前言二.引言三.基础知识8.1.1 编码冗余8.1.2 空间冗余和时间冗余8.1.3 不相关的信息8.1.4图像信息的度量8.1.5保真度准则8.1.6 图像压缩模型8.1.7 图像格式、容器和压缩标准四. 小结 一. 前言 始于…

Linux阻塞IO(高级字符设备二)

阻塞IO属于同步 IO&#xff0c;阻塞IO在Linux内核中是非常常用的 IO 模型&#xff0c;所依赖的机制是等待队列。 一、等待队列介绍 在 Linux 驱动程序中&#xff0c;阻塞进程可以使用等待队列来实现。等待队列是内核实现阻塞和唤醒的内核机制&#xff0c;以双循环链表为基础结…

【嵌入式开源库】timeslice的使用,完全解耦的时间片轮询框架构

完全解耦的时间片轮询框架构 简介项目代码timeslice.htimeslice.clist.hlist.c 创建工程移植代码实验函数说明timeslice_task_inittimeslice_task_addtimeslice_tak_deltimeslice_get_task_num 结尾 简介 timeslice是一个时间片轮询框架&#xff0c;他是一个完全解耦的时间片轮…

力扣刷题 day54:10-24

1.十进制整数的反码 每个非负整数 N 都有其二进制表示。例如&#xff0c; 5 可以被表示为二进制 "101"&#xff0c;11 可以用二进制 "1011" 表示&#xff0c;依此类推。注意&#xff0c;除 N 0 外&#xff0c;任何二进制表示中都不含前导零。 二进制的反…

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…

【数据结构练习题】消失的数字 --- 三种解法超详解

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;数据结构练习题 &#x1f388;相关博文&#xff1a;添加逗号 消失的数字 1. &#x1f388;题目2. &#x1f388;解题思路✨方法一&#xff1a;先排序&#xff0c;再找缺失的值✨方法二&#xff1a;按位…

怎么禁止员工上班追剧

怎么禁止员工上班追剧 安企神终端安全管理软件下载使用 说到员工上班追究打游戏摸鱼&#xff0c;其实是一种不负责任的行为&#xff0c;这样的行为不仅会影响到工作效率&#xff0c;还会给周围的同事带来不好的工作氛围&#xff0c;会造成恶性循环&#xff0c;所以&#xff0…

windows下安装配置CGAL

一、下载安装Boost、CGAL 下载地址&#xff1a;https://sourceforge.net/projects/boost/files/boost-binaries/ Boost是CGAL的强制依赖项。SourceForge上提供了Boost的二进制版本&#xff08;此版本无须编译&#xff0c;可直接使用&#xff09;。Boost安装程序会同时安装Boos…

30天精通Nodejs--第二天:模块系统与npm

深入了解Node.js&#xff1a;模块系统与npm Node.js作为一款强大的服务器端JavaScript运行环境&#xff0c;模块系统和npm&#xff08;Node Package Manager&#xff09;是其成功的重要组成部分。为我们平时提供了便捷的工具和资源&#xff0c;使得在Node.js平台上构建应用变得…

五、Qt中的常用类

1. QString 字符串类 QString是Qt中的字符串类&#xff0c;与C/C不同的是&#xff0c;不再使用ASCII编码&#xff0c;而使用Unicode编码。因此一个字符不是8位的char&#xff0c;而是16位的QChar&#xff0c;这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…

使用jdbc技术连接数据库

连接数据库 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>compile</scope></dependency> </dependencies> g…

腾讯云阿里云服务器mongdb数据库设置密码

避坑点 数据库绑定ip一定要设置0.0.0.0 设置超级管理员账号密码 1、可以使用navicat15连接mongodb数据库&#xff0c;进入命令行界面&#xff0c;输入以下命令 如出现找不到MongoDB shell为可执行文件&#xff0c;选择设置路径&#xff0c;路径为&#xff1a;MongoDB shell是…

【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点

【底层服务/编程功底系列】「网络通信体系」深入探索和分析TCP协议的运输连接管理的核心原理和技术要点 TCP的运输连接管理TCP三次握手三次握手流程分析注意要点 TCP四次挥手TCP之保活计时器&#xff08;keepalive timer&#xff09;保活计时器&#xff08;keepalive timer&…

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql(7)

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql 什么是数据持久化&#xff1f;使用 Python 进行数据持久化步骤 1: 安装 MySQL步骤 2: 安装必要的 Python 库步骤 3: 连接到 MySQL 数据库步骤 4: 创建数据表步骤 5: 插入数据步骤 6: 查询数据步骤 7: 关闭连接…

管理类联考——英语二——翻译篇——定语从句的翻译方法

第三节 定语从句的翻译方法 定语从句的翻译主要分为限制性定语从句和非限制性定语从句的翻译。主要可以分为三种方法&#xff1a;合译法、分译法和转译法。 一、限制性定语从句的翻译方法 限制性定语从句所修饰的先行词自身意义不明确&#xff0c;被定语从句修饰限定后其意…