两数相加 - (LeetCode)

news2024/9/24 7:23:16

前言

今天无意间看到LeetCode的一道“两数相加”的算法题,第一次接触链表ListNode,ListNode结构如下:

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

算法题目

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

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

你可以假设除了数字 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]

提示:

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

解题思路

使用迭代的方法来实现链表的相加。从两个链表的头节点开始,依次将对应位置的数字相加,并保留进位。在遍历完两个链表的所有节点之后,如果还存在进位,就需要在结果链表中追加一个节点来存储进位。

第一版代码

/**
     * 两数相加
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        StringBuilder s = new StringBuilder();
        while (l1 != null) {
            s.append(l1.val);
            l1 = l1.next;
        }
        StringBuilder s1 = new StringBuilder();
        for (int i = s.toString().length(); i > 0; i--) {
            s1.append(s.toString().charAt(i - 1));
        }
        long x1 = Long.parseLong(s1.toString());
        s = new StringBuilder();
        while (l2 != null) {
            s.append(l2.val);
            l2 = l2.next;
        }
        s1 = new StringBuilder();
        for (int i = s.toString().length(); i > 0; i--) {
            s1.append(s.toString().charAt(i - 1));
        }
        long x2 = Long.parseLong(s1.toString());
        long sum = x1 + x2;
        //结果倒序
        s1 = new StringBuilder();
        for (int i = String.valueOf(sum).length(); i > 0; i--) {
            s1.append(String.valueOf(sum).charAt(i - 1));
        }
        //返回链表
        ListNode listNode = new ListNode(Integer.parseInt(s1.substring(0, 1)));
        ListNode p = listNode;//声明一个变量在移动过程中充当节点
        for (int i = 1; i < s1.toString().length(); i++) {
            p.next = new ListNode(Integer.parseInt(s1.substring(i, i + 1)));    //创建链表的下一个节点,并赋值
            p = p.next;    //将指针的位置指向当前节点
        }
        return listNode;
    }

注意:万万没有想到,在LeetCode通过测试,但是提交的时候,却被一个长链表被给卡主了,查看了错误,发现是超出了long的长度,不能用传统的方法来解决,只能通过每一位数的相加,然后进位进行循环计算和进位处理。

经过思考和优化,最后优化代码如下,顺利提交LeetCode通过所有的测试用例。

最终实现代码

/**
     * 两数相加
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode ln = l1;
        ListNode lx = l2;
        StringBuilder res = new StringBuilder();
        int val = 0;
        while (ln != null || lx != null) {
            int x = (ln != null) ? ln.val : 0;
            int y = (lx != null) ? lx.val : 0;
            int sum = x + y + val;
            if (sum >= 10) {
                //大于10
                res.append(sum % 10);
                //下一次运算+N
                val = sum / 10;

            } else {
                //小于10
                res.append(sum);
                //清空进位
                val = 0;
            }
            //下一个
            ln = ln != null ? ln.next : null;
            lx = lx != null ? lx.next : null;
        }
        if (val > 0) {
            //结果有进位
            res.append(val);
        }
        //返回链表
        ListNode listNode = new ListNode(Integer.parseInt(res.substring(0, 1)));
        ListNode p = listNode;//声明一个变量在移动过程中充当节点
        for (int i = 1; i < res.toString().length(); i++) {
            p.next = new ListNode(Integer.parseInt(res.substring(i, i + 1)));//创建链表的下一个节点,并赋值
            p = p.next;    //将指针的位置指向当前节点
        }
        return listNode;
    }

📚学习永无止境,每天进步一点点,向知识的海洋更深处探索。

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

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

相关文章

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…

热门大模型汇总+GPU系列型号+GPU云服务提供商

目录 1 热门大模型汇总2 GPU系列型号3 GPU云服务提供商 1 热门大模型汇总 模型名开发者资源信息使用条件调用例子GPT-3.5OpenAIOpenAI document注册OpenAI账号并且充值GPT-4OpenAIwebsit: GPT-4注册OpenAI账号并且充值如上&#xff0c;模型切换不同版本InternLM商汤InternLM开…

高德地图简单复制操作两分钟就能有近10元的收益日入500+无上限

嘿&#xff0c;伙计们&#xff0c;今天我要告诉你们一个赚钱的好方法&#xff0c;这个方法真的很简单&#xff0c;而且你可以在家里就能操作&#xff0c;不需要出门&#xff0c;不需要见人&#xff0c;只需要你会复制粘贴就行了&#xff0c;是不是很吸引人&#xff1f;好&#…

一本专业130+总分400+上海交通大学819考研经验上交电子信息与通信工程上岸,真题,大纲,参考书。

今年专业课819信号系统与信号处理130&#xff0c;总分400&#xff0c;复试表现中规中矩&#xff08;初试分数查到才开始复习复试&#xff0c;希望大家汲取教训&#xff0c;初试考完就可以录取开始准备复试&#xff09;&#xff0c;交大初试比重很高&#xff0c;良心学校&#x…

保障数据安全:数据防泄漏加密软件功能对比

在数字时代&#xff0c;数据安全成为企业必须重视的关键问题。随着信息技术的飞速发展&#xff0c;数据的传输、存储和处理变得愈发便捷&#xff0c;但这也为数据泄露带来了更大的风险。为了应对这一挑战&#xff0c;数据防泄漏加密软件应运而生&#xff0c;成为保障数据安全的…

ITIL4之IT服务战略

战略和IT战略 战略 的概念最早源于军事领域&#xff0c;意在通过对战争全局的精心规划和指挥&#xff0c;利用有限资源高效达成政治和军事目标。这一思想逐渐扩展到商业、管理乃至信息技术领域&#xff0c;成为指导长远发展和资源配置的核心框架。 IT战略 是将军事战略的智慧…

出国旅游常用英语,柯桥成人英语培训

Where can I catch a taxi?哪里我可以叫到出租车&#xff1f; The taxi zone is right on the left corner over there.出租车站台就在左边转角处。 Are you free?您有空吗&#xff1f; Sure. Where are you going?当然。您要去哪里&#xff1f; Drive me back to Santa …

易基因: WGBS等揭示梨驯化和改良过程中DNA甲基化对果实成熟的作用机制 | 作物育种

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 梨&#xff08;Pyrus ssp.&#xff0c;蔷薇科杏仁核亚科&#xff09;是世界上最重要的温带水果作物之一。与野生梨相比&#xff0c;栽培梨的果实在许多形态特征上表现出显著变化&#xf…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第22课-烟花插件的制作

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第22课-烟花插件的制作 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引…

VBA在Excel中部首组查字法的应用

VBA在Excel中部首组查字法的应用 文章目录 前言一、网站截图二、操作思路三、代码1.创建数据发送及返回方法2.创建截取字符串中的数值的方法3.获取部首对应的编码4.获取特定部首的汉字运行效果截图前言 使用汉语字典查生字、生词,多用拼音查字法和部首查字法。以前都是用纸质…

2024深圳杯数学建模C题参考论文24页+完整代码数据解题

一、问题研究 24页参考论文&#xff1a; 【编译器识别】2024深圳杯C题24页参考论文1-3小问完整解题代码https://www.jdmm.cc/file/2710545/ 为了回答这些问题&#xff0c;我们需要进行一系列的编译实验、分析编译结果&#xff0c;并构建判别函数。以下是对这些问题的初步分析…

Weblogic SSRF

1 SSRF漏洞概述 SSRF漏洞通常是由于服务端提供了从其他服务器应用获取数据的功能&#xff0c;并且没有对目标地址进行过滤与限制。攻击者可以利用这个漏洞&#xff0c;通过篡改获取资源的请求发送给服务器&#xff0c;服务器在没有发现这个请求是非法的情况下&#xff0c;会以…

精酿啤酒:精酿文化的传承者与创新者

在啤酒的世界中&#xff0c;精酿啤酒是一种与众不同的文化现象。这种文化源于对啤酒品质的追求和对传统工艺的尊重&#xff0c;但在不断发展中也不断涌现出创新。作为精酿啤酒的品牌&#xff0c;Fendi club啤酒不仅是这种文化的传承者&#xff0c;更是创新者。 Fendi club啤酒始…

宠物管理系统带万字文档

文章目录 宠物管理系统一、项目演示二、项目介绍三、19000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 宠物管理系统 一、项目演示 宠物管理系统 二、项目介绍 基于springbootvue的前后端分离…

第二步 完善MBR

文章目录 前言一、什么是MBR&#xff1f;二、我们需要什么样的MBR&#xff1f;三、设计我们的MBR&#xff01;1、打印“1 MBR”2、加载次引导程序——loader 四、实践检验&#xff01; 查看系列文章点这里&#xff1a; 操作系统真象还原 前言 在上一篇文章 第一步 从启动BIOS开…

Centos7 配置 DNS服务器

Centos 7 配置DNS服务器 环境描述&#xff1a; 一台服务器和一台用于测试的客户机 服务器IP&#xff1a;192.168.200.132 客户机IP&#xff1a;192.168.200.143 服务器配置 yum install bind bind-utils -y #安装软件包vim /etc/named.conf //编辑named主配置文件listen-on p…

【校园论坛系统】分站式后台,多城市圈子论坛,校园圈子交流平台,二手发布市场,校园圈子论坛系统

简述 校园论坛系统是为学生们提供一个交流、分享信息、互相帮助的平台。它通常包括了各种分类的版块&#xff0c;例如学习交流、社团活动、二手交易、失物招领等等。用户可以在论坛上发帖&#xff0c;回复他人的帖子&#xff0c;也可以私信其他用户。此外&#xff0c;管理员还…

AIGC——Instant-Style文本到图像生成中的样式保留算法解析

0.概述 在过去的几年中&#xff0c;基于调整的扩散模型在广泛的图像个性化和定制任务中取得了显着的进展。然而&#xff0c;尽管有潜力&#xff0c;当前基于调整的扩散模型在生成和生成风格一致的图像方面仍然面临着一系列复杂的挑战&#xff0c;其背后可能有三个原因。首先&a…

单链表题-ysf-反转-中间节点-回文-合并-分割

环形链表的约瑟夫问题_牛客题霸_牛客网 经典的约瑟夫环 #include <stdint.h> #include <stdlib.h> //创建链表 typedef struct ListNode ListNode;ListNode* buyNode(int x){ListNode* newNode(ListNode*)malloc(sizeof(ListNode));if(newNodeNULL){exit(1);}newN…

特斯拉FSD的硬件演进与模型压缩技术解析

引言 随着自动驾驶技术的迅速发展&#xff0c;特斯拉的全自动驾驶&#xff08;FSD&#xff09;系统也在不断进化。最近&#xff0c;特斯拉开始采用端到端的模型来优化其FSD算法&#xff0c;这种变革引发了广泛关注。本文将探讨特斯拉FSD在车载计算能力和模型压缩技术方面的最新…