LeetCode 2 - 两数相加

news2024/9/22 23:30:41

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

在这里插入图片描述
输入: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
题目数据保证列表表示的数字不含前导零

开篇思路(半错误思路):

以为把两个链表数相加,然后再一个个取出来放到链表里面就行了,没想到超int,long的范围…

思路:

首先判断两个链表哪个长,然后按照长的循环,短的循环完了以后就不用继续循环了
然后两个数相加容易进位(>=10),所以next 用于存储进位数,然后sum用于统计两个链表数和next相加
然后就是取整,取余的过程,最后可能存在next进位,所以需要判断是否为0
最后再倒序存一遍就行了

初步结题:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int len = 0, len2 = 0;
        ListNode nodes = null;
        ListNode t1 = l1,t2 = l2;
        //判断 哪个链表比较长
        while (t1 != null) {
            t1 = t1.next;
            len++;
        }
        while (t2 != null) {
            t2 = t2.next;
            len2++;
        }
        int next = 0;
        if (len >= len2){
            for (int i = 0 ; i < len ; i++){
                if (l2 != null){
                    int sum = l1.val + l2.val + next;
                    next = sum / 10;
                    int now = sum % 10;
                    nodes = addL(nodes,now);
                    l2 = l2.next ;
                } else {
                    int sum = l1.val + next;
                    next = sum / 10;
                    int now = sum % 10;
                    nodes = addL(nodes,now);
                }
                l1 = l1.next ;
            }
        }else {
            for (int i = 0 ; i < len2 ; i++){
                if (l1 != null ){
                    int sum = l1.val + l2.val + next;
                    next = sum / 10;
                    int now = sum % 10;
                    nodes = addL(nodes,now);
                    l1 = l1.next ;
                } else {
                    int sum = l2.val + next;
                    next = sum / 10;
                    int now = sum % 10;
                    nodes = addL(nodes,now);
                }
                l2 = l2.next ;
            }
        }
        //最后超范围 如果最后一位是9,需要进一位
        if (next != 0){
            nodes = addL(nodes,next);
        }
        //反着存一遍
        ListNode nodesLast = null;
        //判断 哪个链表比较长
        while (nodes != null) {
            nodesLast = addL(nodesLast,nodes.val);
            
            nodes = nodes.next;
        }
        return nodesLast;
    }

    private ListNode addL(ListNode next,int val){
        if (next == null) {
            next = new ListNode(val);
        } else {
            next = new ListNode(val, next);
        }
        return next;
    }
}

加深: 后续感觉遍历的时候可以优化循环判断,写那么多for循环重复代码太多

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode nodes = null;
        int tree = 0;
        while (l1 != null || l2 != null){
            int c1 = l1 != null ? l1.val : 0;
            int c2 = l2 != null ? l2.val : 0;
            int sum = c1 + c2 + tree;
            tree = sum / 10;
            int now = sum % 10;
            nodes = addL(nodes,now);
            l1 = l1 != null ? l1.next : null;
            l2 = l2 != null ? l2.next : null;
        }
        //最后超范围 如果最后一位是9,需要进一位
        if (tree != 0){
            nodes = addL(nodes,tree);
        }
        //反着存一遍
        ListNode nodesLast = null;
        //判断 哪个链表比较长
        while (nodes != null) {
            nodesLast = addL(nodesLast,nodes.val);
            nodes = nodes.next;
        }
        return nodesLast;
    }

    private ListNode addL(ListNode next,int val){
        if (next == null) {
            next = new ListNode(val);
        } else {
            next = new ListNode(val, next);
        }
        return next;
    }
}

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

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

相关文章

常用基础硬件知识 - 判断MOS管导通

目录1. 概述2. 判断MOS管的导通1. 概述 本文主要记录下基础的硬件知识&#xff0c;方便自己查阅。 2. 判断MOS管的导通 在产品硬件设计中&#xff0c;有时需要程序控制一些电源使能。 1.原理图已经标出了G极(gate)—栅极、S极(source)—源极、D极(drain)—漏极。 如果没有标…

「基础篇」机器学习概览

文章目录1. 什么是机器学习2. 引入机器学习3. 应用场景4. 机器学习分类4.1. 有无人类监督4.2. 是否增量学习4.3. 泛化方式5. 主要挑战6. 测试与验证1. 什么是机器学习 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一个研究领域&#xff0c;让计算机无需…

Mac item2 配置免密登录开发机

1、配置 vi ~/.ssh/config 内容如下&#xff1a; Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 学习&#xff1a; ControlMaster #连接共享 ControlPath #与ControlMaster一起使用&#xff0c;指定连接共享的路径…

log4j控制台不打印日志的故障解决方案

前言 接管了别的项目组的一个代码&#xff0c;在IDAE调试程序的过程中&#xff0c;发现log4j日志居然没有打印在控制台上&#xff0c;日志相关代码也没有问题。 在网上搜索了一圈&#xff0c;总结了一下个人解决这个问题的流程。 流程 1. 判断用了什么配置文件 不知道是出…

线程池的使用——线程池的创建方式

线程池的使用——创建线程线程池的创建线程池的创建方式Executors.newFixedThreadPool&#xff1a;Executors.newCachedThreadPool&#xff1a;Executors.newSingleThreadExecutor&#xff1a;Executors.newScheduledThreadPool&#xff1a;Executors.newSingleThreadScheduled…

24- 深度学习的模型保存和加载 (TensorFlow系列) (深度学习)

知识要点 keras 保存成hdf5文件, 1.保存模型和参数, 2.只保存参数 1.保存模型和参数 save_modelcallback ModelCheckpoint2. 只保存参数 save_weightscallback ModelCheckpoint save_weights_only True 保存模型: 案例数据: Fashion-MNIST总共有十个类别的图像model.save_w…

spark graph基础(一)

1 overView 1.1 图的构成 图由节点和边组成&#xff0c;其中VertexRDD[VD] 和EdgeRDD[ED] 继承和优化了 RDD[(VertexId, VD)] 和RDD[Edge[ED]] 。 class Graph[VD, ED] {val vertices: VertexRDD[VD]val edges: EdgeRDD[ED] }1.2 图使用示例 如下图所示&#xff0c;使用spa…

Typro使用以及安装教程来啦

Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。今天为大家分享下有关Typroa的安装以及使用&a…

TryHackMe-黑我杯

黑我杯 相信我们大家在TryHackMe的日积月累都学到了不少东西&#xff0c;从纯萌新到oscp再到更高 我很高兴能将国内各thm玩家聚集到一起&#xff0c;构建一个更好的学习环境和氛围 本次娱乐分两场&#xff1a; Offensive Pentesting — 中等难度Junior Penetration — 容易难…

@Autowired和@Resource到底有什么区别

Autowired 和 Resource 都是 Spring/Spring Boot 项目中&#xff0c;用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能&#xff0c;但二者却有众多不同&#xff0c;并且这也是常见的面试题之一&#xff0c;所以我们今天就来盘它。 Autowired 和 Resource 的…

Linux 确认 NTP 是否同步成功

NTP 即Network Time Protocol&#xff0c;它通过网络同步计算机系统之间的时钟。NTP 客户端会将其时钟与 NTP 服务器同步。NTP同步状态可以通过以下三个命令查询&#xff1a;ntpq&#xff1a;ntpq 是标准的 NTP 查询程序。ntpstat&#xff1a;显示网络时间同步的状态。timedate…

【房间墙上凿个洞,看你在干嘛~】安全攻防内网渗透-绕过防火墙和安全检测,搭建DNS隐蔽隧道

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Spark 广播/累加

Spark 广播/累加广播变量普通变量广播分布式数据集广播克制 Shuffle强制广播配置项Join Hintsbroadcast累加器Spark 提供了两类共享变量&#xff1a;广播变量&#xff08;Broadcast variables&#xff09;/累加器&#xff08;Accumulators&#xff09; 广播变量 创建广播变量…

快速上手配置firewalld

firewalld使用firewall-cmd命令配置策略。 查看当前firewalld当前服务运行状态 firewall-cmd --state firewalld防火墙状态还用使用如下命令查看状态 systemctl status firewalld 查看所有打开运行的端口 firewall-cmd --zonepublic --list-ports 查看区域信息情况 firewall…

qml学习之qwidget与qml结合使用并调用信号槽交互

学习qml系列之一说明&#xff1a; 学习qml系列之qwiget和qml信号槽的交互使用&#xff0c;并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一&#xff1a;使用QQuickView 这个是Qt5.0中提供的一个类&…

小白量化《穿云箭集群量化》(5)抄底雷达策略

小白量化《穿云箭集群量化》&#xff08;5&#xff09;抄底雷达策略 雷达能够提前发现远处敌我动向。雷达是现代战争不可或缺的装备。 证券市场中分三类人&#xff0c;先知先觉者&#xff0c;后知后觉者&#xff0c;不知不觉者。先知先觉者往往是市场主力&#xff0c;他们拥有信…

Feign踩坑源码分析 -- 请求参数分号变逗号

一.案例 1.1.Post请求&#xff1a; http://localhost:8250/xx/task/test json格式参数&#xff1a; {"string": "a;b;c;d" } 1.2.controller代码&#xff1a; AutowiredDataSourceClientService dataSourceClientService;RequestMapping("/test"…

《计算机原理》——HelloWorld.cpp如何运行的

学校《计算机原理》开课啦&#xff01;特此开辟专栏&#xff0c;将一些知识作为笔记&#xff0c;记录下来。 前言 本篇博客知识点来源于educoder的相关题目 1. 相关知识 1.1 计算机语言 计算机语言是人与计算机之间通讯的语言&#xff0c;计算机语言包括编写计算机程序的字符…

[MatLab]图像绘制

一、绘制二维图像 1.一张图上绘制一条线 绘制代码如下面所示&#xff1a; x 0:0.01:2*pi; y sin(x); figure %建立幕布 plot(x,y) %绘制图像 %设置图像属性 title(ysin(x)) xlabel(x) ylabel(y)xlim([0 2*pi]) %限制x轴的值域 自定义图线的颜色…

GB28181协议--SIP协议介绍

1、SIP协议简介 SIP&#xff08;Session Initiation Protocol&#xff0c;会话初始协议&#xff09;是一个用于建立、更改和终止多媒体会话的应用层控制协议&#xff0c;其中的会话可以是IP电话、多媒体会话或多媒体会议&#xff08;GB28181安防使用的是SIP协议&#xff09;。S…