C/C++ BM11 链表相加(二)

news2025/5/26 2:14:45

文章目录

  • 前言
  • 题目
  • 解决方案一
    • 1.1 思路阐述
    • 1.2 源码
  • 总结

前言

这道题使用链表来实现加法运算,主要是涉及到数据对位以及加法进位的处理。


题目

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围: 0 ≤ n , m ≤ 1000000 0≤n,m≤1000000 0n,m1000000,链表任意值 0 ≤ v a l ≤ 9 0≤val≤9 0val9
要求:空间复杂度 O ( n ) O(n) O(n),时间复杂度 O ( n ) O(n) O(n)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
在这里插入图片描述示例1
输入:[9,3,7],[6,3]
返回值:{1,0,0,0}
说明:如题面解释

示例2
输入:[0],[6,3]
返回值:{6,3}

备注:
1 ≤ n , m ≤ 1 0 6 1≤n,m≤10^6 1n,m106
0 ≤ a i , b i ≤ 9 0≤ai,bi≤9 0ai,bi9

解决方案一

1.1 思路阐述

加法运算一般是个位个位相加,十位十位相加…。也就是说数据要对位才可以相加,就如同题目中给出的加法运算的标准列式计算。

但是对于被加数和加数之间,由于它们是由两个链表存储,由于两个数之间的位数的大小不一样,所以链表存储的节点个数不一样,如果按照从左往右的顺序进行运算,我们可以看到题目给的图中的情况,9和6会相加,但是实际上是900+60这种,位数并不对应。应该执行的操作应该是900+0,30+60。

但是由于链表最后一个存储的节点一定是个位数,往左依次是十位百位,所以在链表中我们可以考虑从右往左的顺序,但是这与我们所用的加法运算的顺序(从左往右)相反,这时候可以使用链表倒置,对于最后的结果再次倒置即为我们所需要的链表。

关于链表倒置参考博客:C/C++ BM1反转链表

两数相加,逢十进一,这里我们设置了一个进位carry。

对于节点,我们首先判断节点是否为空,如果为空,则取0值作为运算数据。(这里相当于补0操作)
如果不为空则把节点的值传递给运算值。

1.2 源码

class Solution {
  public:

    ListNode* addInList(ListNode* head1, ListNode* head2) {

        head1 = reverseList(head1);
        head2 = reverseList(head2);

        //添加表头
        ListNode* res = new ListNode(-1);
        ListNode* head = res;

        int carry = 0;

        while (head1 != NULL || head2 != NULL || carry != 0) {
            //链表不为空则取其值
            int val1 = head1 == NULL ? 0 : head1->val;
            int val2 = head2 == NULL ? 0 : head2->val;
            //相加
            int temp = val1 + val2 + carry;
            //获取进位
            carry = temp / 10;
            temp %= 10;
            //添加元素
            head->next = new ListNode(temp);
            head = head->next;
            //移动下一个
            if (head1 != NULL)
                head1 = head1->next;
            if (head2 != NULL)
                head2 = head2->next;
        }

        return reverseList(res->next); 
    }
    ListNode* reverseList(ListNode* head) {
        if (!head) {
            return nullptr;
        }
        ListNode* pre = nullptr;
        ListNode* current = head;

        while (current) {
            ListNode* temp = current->next;
            current->next = pre;
            pre = current;
            current = temp;
        }
        return pre;

    }
};

总结

这道题回顾了一下链表翻转。

对于链表的四则运算涉及到对位情况,考虑使用翻转链表会更好。不能按照常规的四则运算从左到右的顺序来做,要结合链表本身的特性来做。

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

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

相关文章

【Docker】集群容器监控和统计 Portainer基本用法

Portainer是一款轻量级的应用,它提供了图形化界面,用川于方便地管理Docker环境,包括单机环境和集群环境。 主要功能:实现集群容器的监控和统计 下载安装 官网:https://www.portainer.io 文档:https://do…

短剧App:引领移动娱乐新潮流

随着科技的飞速发展,人们对于娱乐的需求也在不断变化。近年来,短剧App逐渐崭露头角,成为了移动娱乐的新宠。本文将探讨短剧App的发展趋势、市场现状、用户需求以及开发过程中的关键因素。 一、短剧App的发展趋势 短剧App以其简短、精悍的特…

无可执行权限加载 ShellCode

简单来说就是可以直接加载可读内存中的加密 ShellCode,不需要解密,不需要申请新的内存,也不需要改可执行权限。应用不仅仅在上线,上线后的各种功能都可以通过 ShellCode 实现 1.查杀点 现状 在加载 ShellCode、使用 BOF 等时候…

Mysql如何优化数据查询方案

mysql做读写分离 读写分离是提高mysql并发的首选方案。 Mysql主从复制的原理 mysql的主从复制依赖于binlog,也就是记录mysql上的所有变化并以二进制的形式保存在磁盘上,复制的过程就是将binlog中的数据从主库传输到从库上。 主从复制过程详细分为3个阶段…

《英伟达-本地AI》--NVIDIA Chat with RTX-本机部署

阿丹: 突然发现公司给配置的电脑是NVIDIA RTX 4060的显卡,这不搞一搞本地部署的大模型玩一玩??? 从0-》1记录一下本地部署的全过程。 本地模型下载地址: Build a Custom LLM with Chat With RTX | NVIDIA…

Rocky 8.9 Kubespray v2.24.0 在线部署 kubernetes v1.28.6 集群

文章目录 1. 简介2. 预备条件3. 基础配置3.1 配置hostname3.2 配置互信 4. 配置部署环境4.1 在线安装docker4.2 启动容器 kubespray4.3 编写 inventory.ini4.4 关闭防火墙、swap、selinux4.5 配置内核模块 5. 部署 1. 简介 kubespray​ 是一个用于部署和管理 Kubernetes 集群的…

vulhub中Apache Log4j Server 反序列化命令执行漏洞复现(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 1.我们使用ysoserial生成payload,然后直接发送给your-ip:4712端口即可。 java -jar ysoserial-…

111期_C++_2024年1月份作业博客_选择题错题总结

一、野指针问题:在定义的时候没有初始化,就不能能用scanf 或 printf 二、一个变量出现在表达式的两边作为两个不同的操作数, 并且其中一个操作数带有,此时表达式出现歧义 三、两端出栈问题: 错因:未理解题…

VirtualBox虚拟机磁盘VDI文件压缩瘦身

文章目录 问题现象虚拟机文件目录结构处理方法清除宿主机文件和虚拟机快照虚拟机磁盘瘦身 问题现象 2月7日下午四点多,我已经休假了,某县的客户运维方打来电话,说平台挂了,无法访问 客户是提供的一台Windows server2016机器部署平…

OpenCV边缘检测与视频读写

原理 OpenCV中的边缘检测原理主要基于图像梯度的计算,包括一阶梯度和二阶梯度。 一阶梯度:它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效&…

[OpenAI]继ChatGPT后发布的Sora模型解析与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

C++11---(2)

目录 一、新增容器 1.1、array 1.2、forward_list 1.3、unordered系列 二、右值引用和移动语义 2.1、什么是左值,什么是左值引用 2.2、什么是右值,什么是右值引用 2.3、左值引用和右值引用比较 2.4、右值引用使用场景和意义 2.5、右值引用引用…

利用ChatGPT提升测试工作效率——测试工程师的新利器

1、前言 随着ChatGPT的爆火,各个行业开始尝试利用ChatGPT来提升工作效率。其中,测试工程师们也开始探索如何应用ChatGPT来加强测试工作。在本文中,我们将从测试工程师的角度出发,探讨ChatGPT在测试工作中的应用。通过ChatGPT&…

如何使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

文章目录 1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 本篇文章讲解如何使用Docker搭建YesPlayMusic网易云音乐播放器,并且结合cpolar内网穿透实现公网访问音乐播放器。 YesPlayMusic是一款优秀的个人音乐播放器&am…

阿里云服务器镜像是什么?如何选择镜像?

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

社区店经营全攻略:如何选址、运营并打造火爆生意?

随着电商的兴起,实体店的经营面临着越来越多的挑战。然而,社区店依然具有独特的优势,如便捷的地理位置、与消费者的紧密互动等。 作为在社区店开鲜奶吧5年的创业者,我深有感触,那么这篇文章将为你提供最有价值的干货信…

SpringBoot+WebSocket实现即时通讯(四)

前言 紧接着上文《SpringBootWebSocket实现即时通讯(三)》 本博客姊妹篇 SpringBootWebSocket实现即时通讯(一)SpringBootWebSocket实现即时通讯(二)SpringBootWebSocket实现即时通讯(三&…

代码随想录算法训练营第十八天|235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树节点

235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近…

函数指针概念的理解要点

1:理解函数 函数即为代码,代码就应该放在内存中,是内存,就有地址 void CmpFun(int a,int b){if(a>b)printf("最大的数为%d",a);elseprintf("最大的数为%d",b);}int main(){printf("输出函数CmpFu…

redo日志——log buffer与磁盘的交互详解

目录 一、redo日志刷盘机制(时机) 1、log buffer 空间不足时 2、事务提交 3、后台线程 4、正常关闭服务器 5、checkpoint时 二、数据目录中的redo日志文件 三、redo日志文件格式 log buffer与磁盘交互的最小单位——block 文件格式 四、Log Se…