两个链表相加

news2024/10/6 10:28:28

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

数据范围:0≤n,m≤1000000,链表任意值 0≤val≤9
要求:空间复杂度 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}

 

解题思路:

其实,看到这个题目,首先想到的是将链表逐个逐个取出,组成一个数字,然后通过数字相加得到最终的结果,然后再把结果的每一位数字分别填入新的链表中。

但是,想法是好的,现实是残酷的!

题中要求链表长度的范围为0 ~ 10^{6},即如果将它组成一个数字,那得要100万位的数字,显然不现实,只能回归到链表的操作上来。

题目要求时间复杂度为O(n),那只要顺序轮询就可以了。因为是按位加法,还要考虑到进位。类似如下的方式:

所以,首先想到的就是将链表翻转,然后从头计算。

代码:

struct ListNode* ReverseList(struct ListNode* pHead );
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
    if (head1 == NULL) {  //确定链表是否有效
        return head2;
    }

    if (head2 == NULL) {
        return head1;
    }

    head1 = ReverseList(head1); //翻转链表
    head2 = ReverseList(head2);

    struct ListNode* nHead = (struct ListNode*)malloc(sizeof(struct ListNode)); //申请一个新的节点,很有用
    struct ListNode* p = nHead;
    int vForward = 0;

    while (head1 != NULL && head2 != NULL) { //位数对齐,先计算
        p->next = head1;
        p = p->next;

        p->val = vForward + head1->val + head2->val;
        if (p->val >= 10) {
            p->val -= 10;
            vForward = 1;
        } else {
            vForward = 0;
        }

        head1 = head1->next;
        head2 = head2->next;
    }

    p->next = (head1 == NULL) ? head2 : head1; //多出来的部分需要单独处理
    while (p->next != NULL) {
        p = p->next;
        p->val = vForward + p->val;
        if (p->val >= 10) {
            p->val -= 10;
            vForward = 1;
        } else {
            vForward = 0;
        }
    }

    if (vForward) {  //可能还有进位,最开始malloc的节点就用上了
        p->next = nHead;
        nHead = nHead->next;
        p = p->next;
        p->val = 1;
        p->next = NULL;
    } else {
        p = nHead;
        nHead = nHead->next;
        free(p);
    }

    nHead = ReverseList(nHead); //计算完成,再来一次翻转

    return nHead;
}


struct ListNode* ReverseList(struct ListNode* pHead ) {
    struct ListNode* result = NULL;

    for (struct ListNode* p = pHead; pHead != NULL; p = pHead) {
        pHead = p->next;
        p->next = result;
        result = p;
    }

    return result;
}

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

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

相关文章

Docker使用记录

文章目录 Docker基本使用Docker配置查看状态卸载安装使用 apt 存储库安装在 Ubuntu 上安装 Docker 桌面(非必要) Docker实例使用现有的镜像查找镜像拖取镜像列出镜像列表更新镜像导出镜像删除镜像导入镜像清理镜像查看容器导出容器导入容器-以镜像的方式创建容器重启容器进入容…

Springboot Apollo配置yml

1.背景: 项目都是配置的Apollo配置中心来进行配置的。新功能需要yml格式的数据(层级结构更清晰) 2.问题: 1)Apollo是否支持yml格式的配置信息? 2)配置好了以后读取不到Apollo配置的yml。 3…

平心而论,做电商数据分析还得这款大数据分析平台

各个业务系统上的数据能放一起分析了吗?根据物流周期做好库存计划了吗?广告投入分析评估报表出来吗?运营、物流、财务等部门环节间的信息脱节解决了吗?做电商数据分析不仅仅是做一两个销售分析报表,而是要综合各个部门…

vue3 - 内置组件Teleport的使用

<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 1&#xff0c;使用场景&#xff1a; 一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看&#xff0c;它在 DOM 中应该…

Python网络爬虫使用教程

文章目录 一、URL资源抓取1.urllib2.requests3.requests-html二、正则表达式三、数据解析1.Beautiful Soup2.lxml3.selectolax四、自动化爬虫selenium五、爬虫框架1.Scrapy2.pyspider框架六、模拟登录与验证码识别七、autoscraper&#xff08;不需要编程基础&#xff09; 一、U…

小鱼深度产品测评之:阿里云新款通用算力型ECS云服务器Universal实例,实力与能力并存的一款产品。

ECS U实例评测 1、引言2、购买流程3、向导展示4、实例4.1 创建实例4.2 迁移上云4.3 查询功能4.3.1 下拉框选项4.3.2 查询结果保存 4.4 默认定位4.5 分组4.6 监控4.6.1 查看监控大盘4.6.2 自定义报警规则4.6.3 一键报警 4.7 列表操作4.7.1 资源变配4.7.2 远程链接4.7.3 续费 4.8…

深入探究测试用例设计的底层逻辑

测试用例是每位测试人员都绕不开的话题&#xff0c;也是大家习以为常的事情。几乎所有测试相关的公众号、博客、专栏&#xff0c;都会提及测试用例&#xff0c;由此可见它的重要性。但是&#xff0c;有许多从业者&#xff0c;对测试用例的设计仍然依靠经验积累&#xff0c;即使…

达梦8命令行方式安装创建数据库

在实际生产环境中&#xff0c;有很多linux服务器并没有安装桌面&#xff0c;无法调用图形化界面来安装、创建和配置数据库。下面讲解在linux操作系统中&#xff0c;以命令行的形式创建、安装、启动DM8数据库。 一、命令行安装数据库软件 1.用root账号将数据库安装包dm8_setup…

DJ4-3 动态分区分配算法

目录 一、基于顺序搜索的分配算法 1、最佳适应算法&#xff08;BF&#xff09; 2、最坏适应算法&#xff08;Worst fit&#xff0c;WF&#xff09; 3、首次适应算法&#xff08;First Fit&#xff0c;FF&#xff09; 4、下次适应算法&#xff08;Next fit&#xff0c;NF&a…

机器人技术在 PCB 制造中的关键优势

原创 | 文 BFT机器人 印刷电路板或 PCB 相当于神经系统的计算机。它是连接微型电子元件&#xff08;电阻器、微芯片、连接器和电容器&#xff09;的基础。它极其复杂&#xff0c;有些部分非常微小&#xff0c;只能在显微镜下才能看到。 机器人技术是 PCB 制造的核心。没有人能…

从事软件测试行业的你是“摆烂”还是“内卷”?

工作几年后&#xff0c;你还在持续地学习吗&#xff1f; 很多人可能在工作本身上已经耗掉了所有的精力&#xff0c;尤其是在软件行业&#xff0c;加班是常态&#xff0c;空余时间再想集中精力学习某方面的知识会很吃力。 如果像我一样&#xff0c;开始几年做的是基本的功能测…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了极为重要的角色&#xff0c;连接着应用的各个部分。对API进行自动化测试能够提高测试效率&#xff0c;降低错误&#xff0c;确保软件产品的质量。本文将通过实…

IT安全解决方案保护企业网络安全

全球每年报告数以万计的网络安全事件&#xff0c;云解决方案和远程工作的大规模采用意味着大多数组织的攻击面呈指数级增长。采用正确的网络安全解决方案是保护企业免受这些攻击的唯一方法。使用正确IT安全解决方案企业网络安全。 IT安全解决方案 ManageEngine IT安全解决方案…

5 月 Web3 游戏月报:增长有迹可循,但困局仍在

作者&#xff1a;lesleyfootprint.network 5 月 13 日&#xff0c;Line 旗下 NFT 子公司计划将于 2023 年发布五款 NFT 游戏。越来越多的游戏开发者和项目开始涌现&#xff0c;web3 游戏不再仅仅是投机的象征&#xff0c;而是真正有越来越多的项目方深耕与此。然而&#xff0c…

2023-6-13-IP配置知识补充学习

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

大数据分析平台释疑专用帖第二弹

不管是想要快速了解BI大数据分析平台&#xff0c;还是想要了解BI和自己的需求匹配度&#xff0c;都可关注我们的释疑专用贴。 1、可以分析直播数据吗&#xff1f; 严格来说&#xff0c;只要能够提供数据&#xff0c;就可以做数据可视化分析&#xff0c;直播数据也同理。 如果…

活动新闻稿为什么有企业采访,权威专家表述更容易被央媒报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 最近有很多新闻稿想让胡老师来同步一些央媒&#xff0c;或者地方头部媒体&#xff0c;因为媒体的权重都比较高&#xff0c;有些稿子写的比较平&#xff0c;缺乏亮点和新闻性&#xff0c;…

接口测试工具Postman学习之常用断言

目录 什么是断言&#xff1f; Postman常见断言方法介绍&#xff1a; 总结&#xff1a; 什么是断言&#xff1f; 断言——就是结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。…

Java实训日志02

文章目录 八、项目开发实现步骤&#xff08;二&#xff09;创建项目1、创建Java项目2、创建目录&#xff0c;添加素材&#xff08;1&#xff09;创建help目录添加帮助文档&#xff08;2&#xff09;创建images目录添加图像素材&#xff08;3&#xff09;创建lib目录添加数据库驱…

直播预告 | 博睿学院:AIOps利器-混沌工程实践

混沌工程是通过应用一些经验探索的原则&#xff0c;来学习观察系统是如何反应的。应用混沌工程可以对系统抵抗扰动并保持正常运作的能力&#xff08;稳定性&#xff09;进行校验和评估&#xff0c;提前识别未知隐患并进行修复&#xff0c;进而保障系统更好地抵御生产环境中的失…