两个链表相加

描述

假设链表中每一个节点的值都在 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Triton教程 -- 利用Triton部署你自己的模型

Triton教程—利用Triton部署你自己的模型 给定一个经过训练的模型,我如何使用 Triton 推理服务器以最佳配置大规模部署它? 本文档旨在帮助回答这个问题。 对于那些喜欢高级概述的人,下面是大多数用例的通用流程。 对于那些希望直接进入的人…

Windows Server AD域控服务器升级/迁移(AD域控的五大角色转移)

Windows Server AD域控服务器升级/迁移(AD域控的五大角色转移) 新域控服务器安装配置域控服务器,加入现有域域控角色迁移到新域控服务器原域控服务器降级退域 本文主要介绍在现有域环境下如何进行域控服务器的迁移/升级操作。对于域结构的网络…

抖音seo矩阵系统源码|需求文档编译说明(一)

抖音seo矩阵系统文章目录技术囊括 ①产品原型 ②需求文档 ③产品流程图 ④部署方式说明 ⑤完整源码 ⑥源码编译方式说明 ⑦三方框架和SDK使用情况说明和代码位置 ⑧平台操作文档 ⑨程序架构文档 短视频矩阵系统源码开发锦囊囊括前言一、短视频账号矩阵系统开发者必备能力语言&…

深度相机介绍

一、什么是深度相机 (五)深度相机:结构光、TOF、双目相机 - 知乎 传统的RGB彩色普通相机称为2D相机,只能拍摄相机视角内的物体,没有物体到相机的距离信息,只能凭感觉感知物体的远近,没有明确的数…

基于SpringBoot+vue的简历系统设计和实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

seatunnel入门案例,集群模式

目录 安装部署 解压 环境变量 安装plugin 添加资源jar包 SEATUNNEL 配置文件 env:环境设置 source:数据源设置 sink:数据去向设置 transform: 数据转换设置 运行方式 seatunnel 引擎(zeta) 本地模式 集群模式 安装部署 解压 tar…

深入浅出Node.js中的node_modules

文章目录 1. 什么是node_modulesnode_modules是什么npm包管理器和node_modules的关系 2. 如何安装和使用node_modulesnpm安装和使用node_modules的基本命令package.json文件的作用和结构npm包版本号的含义及如何管理包版本 3. 如何发布自己的npm包npm包的结构和规范如何将自己的…

基于SpringBoot+微信小程序的医院预约叫号小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 该项目是基于uniappWe…

基于Python的接口自动化测试框架

目录 前言: 项目背景 工具选择 框架思路 第三方库介绍 代码实现 不足之处 前言: Python是一种流行的编程语言,Python的易学性和易用性使得它成为编写接口自动化测试框架的理想选择。在Python中,有许多库可以帮助我们执行HTTP请求…

淘宝拍照基于端云协同的视频流实时搜索实践

本文介绍了实时视频流的主体识别场景,未来实时搜将会融合图搜主链路并在XR场景发力,未来的场景我们取名为“元视界”(MetaSight) 引言 很多熟悉淘宝的用户知道,点击首页搜索框的相机icon,就可以使用淘宝拍照…

SpringBoot--日志

日志的作用? 记录用户登陆日志,方便分析用户是正常登陆还是恶意破解用户记录系统的操作日志,方便数据恢复和定位操作人记录程序的执行时间,方便为以后优化程序提供数据支持 日志是程序的重要组成部分,最重要的用途是…

Redis GEO地理位置信息的应用

Redis GEO地理位置信息的应用 Redis GEO概述应用场景Redis GEO命令GEO命令演示 Redis GEO实现附近人的功能基础类API接口接口实现执行测试 Redis GEO 概述 Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位…

Flutter 库:提升开发体验——Quick

Flutter 库:提升开发体验——Quick 文章目录 Flutter 库:提升开发体验——Quick一、概述1、简介2、功能3、官方资料4、思考 二、基本使用1、安装2、基本使用3、运行结果 三、List 列表扩展示例四、Map 映射扩展示例五、其它示例 一、概述 1、简介 Quic…

MySQL-索引详解(五)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

设计模式(十三):行为型之模板方法模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

微服务_Hystrix

在每个服务中引用该组件,监控当前组件。可被GateWay、Fegin集成。简介 作用:防止服务雪崩 Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系…

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一,可将数据存储在键/值对中,同 Java 中的 Map 相似。 1、什么是字典理解? 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

深入理解Linux虚拟内存管理(七)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理…

chatgpt赋能python:Introduction

Introduction 在机器学习中,模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数,以便能够准确地预测未来的值。Python是一种功能强大的编程语言,提供许多库和框架来训练机器学习模型。在本文中,我们将探讨如何…

mysql 最常用的一些语句

1 数据库相关操作 CREATE DATABASE IF NOT EXISTS daily-test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; drop database daily_test; use daily_test 具体操作如下图上所示: 2 mysql常用数据类型 MySQL 数据类型 | 菜鸟教程 3 数据库表相关操作…