牛客 - 链表相加(二)

描述
假设链表中每一个节点的值都在 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}
备注:
1 ≤ n , m ≤ 1 0 6 1≤n,m≤10^6 1n,m106
0 ≤ a i , b i ≤ 9 0≤a_i ,b_ i ≤9 0ai,bi9

思路一:

  • 把两个链表的元素都添加到两个容器中,并反转这两个链表,根据两个链表的长度的最大值,对长度较小的那个进行补齐。
  • 补齐之后对进行运算,创建一个结果容器,如果两个容器的元素的值加起来大于等于10,就让当前值减去10,并加上进制位,插入结果容器,最后如果进制位不等于默认值,就说明还需要把这个进制位也加入结果容器中。
  • 结果容器运算结束反转结果容器,并创建虚拟节点,将元素一个一个插入虚拟节点中,最后返回虚拟节点的下一个节点。
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <list>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 特殊情况处理:如果两个链表都为空,返回nullptr
        if(head1 == nullptr && head2 == nullptr) return nullptr;
        // 如果其中一个链表为空,直接返回另一个链表
        if(head1 == nullptr) return head2;
        if(head2 == nullptr) return head1;
        
        // 将链表数据存到两个容器中
        std::vector<int> data1; // 存储链表1的值
        std::vector<int> data2; // 存储链表2的值

        ListNode* currNode1 = head1; // 遍历链表1的指针
        ListNode* currNode2 = head2; // 遍历链表2的指针
        // 遍历链表1,将每个节点的值存入data1
        while(currNode1 != nullptr)
        {
            data1.push_back(currNode1->val);
            currNode1 = currNode1->next;
        }
        // 遍历链表2,将每个节点的值存入data2
        while(currNode2 != nullptr)
        {
            data2.push_back(currNode2->val);
            currNode2 = currNode2->next;
        }

        // 反转两个容器,因为链表是从低位到高位存储的,反转后便于从高位开始相加
        std::reverse(data1.begin(), data1.end());
        std::reverse(data2.begin(), data2.end());

        // 确定两个容器的长度,并将较短的容器用0填充到与较长容器相同的长度
        int len = 0;
        if(data1.size() > data2.size()) 
        {
            len = data1.size();
            data2.resize(len, 0); // 用0填充data2
        }
        else 
        {
            len = data2.size();
            data1.resize(len, 0); // 用0填充data1
        }
 
        // 创建结果容器,用于存储相加后的每一位数字
        std::vector<int> res;
        int flag = 0; // 进位标志
        // 从高位到低位逐位相加
        for(int i = 0; i < len; i++)
        {
            int new_val = data1[i] + data2[i] + flag; // 当前位的和加上进位

            if(new_val >= 10) // 如果当前位的和大于等于10,需要进位
            {
                new_val = new_val - 10; // 当前位的值减去10
                flag = 1; // 设置进位标志为1
            }
            else 
            {
                flag = 0; // 如果不需要进位,重置进位标志
            }
            res.push_back(new_val); // 将当前位的结果存入结果容器
        }
        // 如果最后还有进位,将进位添加到结果中
        if(flag != 0)
        {
            res.push_back(flag);
        }
        // 反转结果容器,使其从低位到高位存储
        std::reverse(res.begin(), res.end());
        
        // 创建新的链表来存储结果
        ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
        ListNode* currNode = dummy; // 当前节点指针
        // 遍历结果容器,创建链表节点
        for(int i = 0; i < res.size(); i++)
        {
            ListNode* newNode = new ListNode(res[i]); // 创建新节点
            currNode->next = newNode; // 将新节点连接到当前节点
            currNode = currNode->next; // 移动当前节点指针
        }
        ListNode* resNode = dummy->next; // 获取结果链表的头节点
        delete dummy; // 删除虚拟头节点
        return resNode; // 返回结果链表的头节点
    }
};

思路二:
直接反转两个链表,反转之后进行运算

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <list>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* reverseList(ListNode* head)
    {
        // 创建一个前指针
        ListNode* prevNode = nullptr;
        ListNode* currNode = head;

        while(currNode != nullptr)
        {
            // 暂存下一个节点
            ListNode* nextNode = currNode->next;
            // 反转当前节点的指针
            currNode->next = prevNode;
            // 移动prev到当前节点
            prevNode = currNode;
            // 继续处理下一个节点
            currNode = nextNode;
        }
        // prev最终指向新的头结点
        return prevNode;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 特殊情况处理:如果两个链表都为空,返回nullptr
        if(head1 == nullptr && head2 == nullptr) return nullptr;
        // 如果其中一个链表为空,直接返回另一个链表
        if(head1 == nullptr) return head2;
        if(head2 == nullptr) return head1;

        // 反转两个链表,使其从低位到高位存储
        head1 = reverseList(head1);
        head2 = reverseList(head2);

        // 创建一个虚拟头节点,方便操作
        ListNode* dummy = new ListNode(0);
        // 当前节点指针,用于构建结果链表
        ListNode* currNode = dummy;

        // 分别指向两个链表的当前节点
        ListNode* currNode1 = head1;
        ListNode* currNode2 = head2;
        // 进位标志
        int flag = 0;

        // 遍历两个链表,直到两个链表都为空
        while(currNode1 != nullptr || currNode2 != nullptr) {
            // 获取当前节点的值,如果链表为空则取0
            int val1 = currNode1 != nullptr ? currNode1->val : 0;
            int val2 = currNode2 != nullptr ? currNode2->val : 0;

            // 计算当前位的和,加上进位
            int new_val = val1 + val2 + flag;

            // 如果当前位的和大于等于10,需要进位
            if(new_val >= 10) {
                new_val -= 10; // 当前位的值减去10
                flag = 1; // 设置进位标志为1
            } else {
                flag = 0; // 如果不需要进位,重置进位标志
            }

            // 创建新节点,存储当前位的值
            ListNode* newNode = new ListNode(new_val);
            // 将新节点连接到结果链表
            currNode->next = newNode;
            // 移动当前节点指针
            currNode = currNode->next;

            // 如果链表1不为空,移动到下一个节点
            if (currNode1 != nullptr) currNode1 = currNode1->next;
            // 如果链表2不为空,移动到下一个节点
            if (currNode2 != nullptr) currNode2 = currNode2->next;
        }

        // 如果最后还有进位,添加一个新节点
        if(flag != 0) {
            ListNode* newNode = new ListNode(flag);
            currNode->next = newNode;
        }

        // 获取结果链表的头节点
        ListNode* resNode = dummy->next;
        // 删除虚拟头节点
        delete dummy;

        // 反转结果链表,使其从高位到低位存储
        resNode = reverseList(resNode);
        return resNode;
    }
};

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

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

相关文章

Math Reference Notes: 符号函数

1. 符号函数的定义 符号函数&#xff08;Sign Function&#xff09; sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值&#xff08;即正数、负数或零&#xff09;的函数。 它的定义如下&#xff1a; sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…

手写MVVM框架-构建虚拟dom树

MVVM的核心之一就是虚拟dom树&#xff0c;我们这一章节就先构建一个虚拟dom树 首先我们需要创建一个VNode的类 // 当前类的位置是src/vnode/index.js export default class VNode{constructor(tag, // 标签名称&#xff08;英文大写&#xff09;ele, // 对应真实节点children,…

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…

ASUS/华硕天选5锐龙版 FA507U 原厂Win11 22H2 专业版系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;带一键恢复&#xff0c;以及机器所有的驱动和软件。 支持型号&#xff1a;FA507UU FA507UI FA507UV 系统版本&#xff1a;Windows 11 22H2 文件下载&#xff1a;asusoem.cn/920.html 文件格式&#xff…

React图标库: 使用React Icons实现定制化图标效果

React图标库: 使用React Icons实现定制化图标效果 图标库介绍 是一个专门为React应用设计的图标库&#xff0c;它包含了丰富的图标集合&#xff0c;覆盖了常用的图标类型&#xff0c;如FontAwesome、Material Design等。React Icons可以让开发者在React应用中轻松地添加、定制各…

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…

MacBook Pro(M1芯片)DeepSeek R1 本地大模型环境搭建

MacBook Pro&#xff08;M1芯片&#xff09;DeepSeek R1 本地大模型环境搭建 这一阵子deepseek真的是太火了&#xff0c;这不&#xff0c;R1出来后更是掀起AI的狂欢&#xff0c;作为一个AI的外行人&#xff0c;也是忍不住想要拿过来感受一番&#xff5e;&#xff5e; 主要呢&…

数据结构:队列篇

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 文章目录 系列文章目录前言一.队列的概念和结构1.1概念一、动态内存管理优势二、操作效率与安全性…

Python的那些事第十二篇:从入门到“不撞南墙不回头”Python 文件操作与异常处理

Python 文件操作与异常处理&#xff1a;从入门到“不撞南墙不回头” 目录 Python 文件操作与异常处理&#xff1a;从入门到“不撞南墙不回头” 一、引言 二、Python 文件操作 三、Python 异常处理 四、综合实例&#xff1a;学生成绩管理系统 五、总结与展望 一、引言 1.…

论文解读:《基于TinyML毫米波雷达的座舱检测、定位与分类》

摘要 本文提出了一种实时的座舱检测、定位和分类解决方案&#xff0c;采用毫米波&#xff08;mmWave&#xff09;雷达系统芯片&#xff08;SoC&#xff09;&#xff0c;CapterahCAL60S344-AE&#xff0c;支持微型机器学习&#xff08;TinyML&#xff09;。提出了波束距离-多普勒…

【B站保姆级视频教程:Jetson配置YOLOv11环境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11环境&#xff08;7&#xff09;Ultralytics YOLOv11环境配置 文章目录 1. 下载YOLOv11 github项目2. 安装ultralytics包3. 验证ultralytics安装3.1 下载yolo11n.pt权重文件3.2 推理 1. 下载YOLOv11 github项目 创建一个目录&#xff0c;用于存放YOLOv11的项目…

代码讲解系列-CV(二)——卷积神经网络

文章目录 一、系列大纲二、卷积神经网络&#xff08;图像分类为例&#xff09;2.1 pytorch简介训练框架张量自动微分动态计算图更深入学习 2.2 数据输入和增强Dataset—— torch.utils.data.DatasetDataLoader——torch.utils.data.Dataloader数据增强 2.3 CNN设计与训练nn.Mod…

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…

堆的基本概念

1.1 堆的基本概念 虚拟机所在目录 E:\ctf\pwn-self 进入虚拟机的pwndocker环境 holyeyesubuntu:~$ pwd /home/holyeyes holyeyesubuntu:~$ sudo ./1run.sh IDA分析 int __fastcall main(int argc, const char **argv, const char **envp) { void *v4; // [rsp20h] [rbp-1…

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…

合宙air001使用命令行烧写固件

起因&#xff1a; 做了个小板子给同事使用&#xff0c;但同事没有air001的arduino编译烧录环境&#xff0c;安装的话&#xff0c;对于没有接触过arduino的人有些复杂&#xff0c;所以想着能不能直接烧录编译好的固件&#xff1b; 经过&#xff1a; 在网上搜索相关教程&#…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备&#xff08;摄像机、麦克风&#xff09;媒体流实现Web端预览。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 demo-server解耦 原始代码解析 http服务器端 import argparse import asyncio import json…