每日一题——两数相加

两数相加

    • 问题描述
    • 问题分析
    • 解题思路
    • 代码实现
    • 代码解析
    • 注意事项
    • 示例运行
    • 总结

问题描述

在这里插入图片描述
给定两个非空链表,表示两个非负整数。链表中的每个节点存储一个数字,数字的存储顺序为逆序(即个位在链表头部)。要求将这两个数字相加,并以相同形式返回一个表示和的链表。

示例:

  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
  • 题目数据保证链表表示的数字不含前导零。

问题分析

  1. 链表结构:链表是一种线性数据结构,每个节点包含一个值和指向下一个节点的指针。本题中,链表的节点值表示数字的每一位。
  2. 逆序存储:链表的头节点存储的是数字的个位,链表的尾节点存储的是数字的最高位。
  3. 进位处理:在逐位相加时,可能需要处理进位的情况。

解题思路

  1. 创建虚拟头节点:为了方便操作,创建一个虚拟头节点 dummy,其 next 指针指向结果链表的头节点。
  2. 遍历链表:同时遍历两个链表,逐位相加,并处理进位。
  3. 处理剩余部分:如果其中一个链表先遍历完,继续处理另一个链表的剩余部分。
  4. 处理最终进位:如果最后还有进位,需要在结果链表末尾添加一个新节点。

代码实现

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {// 创建虚拟头节点struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* current = dummy;int carry = 0;  // 进位标志// 遍历两个链表while (l1 || l2) {// 获取当前节点的值(如果链表为空,则为0)int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;// 计算当前位的和int sum = n1 + n2 + carry;carry = sum / 10;  // 更新进位sum = sum % 10;    // 当前位的值// 创建新节点存储当前位的值current->next = (struct ListNode*)malloc(sizeof(struct ListNode));current->next->val = sum;current->next->next = NULL;current = current->next;// 移动链表指针if (l1) {l1 = l1->next;}if (l2) {l2 = l2->next;}}// 如果最后还有进位,添加一个新节点if (carry > 0) {current->next = (struct ListNode*)malloc(sizeof(struct ListNode));current->next->val = carry;current->next->next = NULL;}// 返回结果链表的头节点return dummy->next;
}

代码解析

  1. 虚拟头节点dummy 是一个虚拟头节点,用于简化链表操作。最终返回的结果链表是 dummy->next
  2. 逐位相加:通过 n1n2 获取当前节点的值,加上进位 carry,计算当前位的和 sum
  3. 进位处理carry = sum / 10 用于更新进位,sum = sum % 10 用于获取当前位的值。
  4. 链表遍历:通过 l1l2 的指针移动,逐位处理两个链表。
  5. 最终进位:如果最后还有进位,需要在结果链表末尾添加一个新节点。

注意事项

  1. 链表为空的处理:在计算 n1n2 时,需要判断链表是否为空,避免访问空指针。
  2. 内存管理:每次创建新节点时,需要使用 malloc 分配内存,并确保在程序结束时释放内存(如果需要)。

示例运行

以示例 1 为例:

  • 输入:l1 = [2,4,3]l2 = [5,6,4]
  • 计算过程:
    • 第一位:2 + 5 = 7,无进位,结果链表为 [7]
    • 第二位:4 + 6 = 10,进位为 1,当前位为 0,结果链表为 [7,0]
    • 第三位:3 + 4 + 1 = 8,无进位,结果链表为 [7,0,8]
  • 输出:[7,0,8]

总结

本题考察了链表的操作和进位处理。通过创建虚拟头节点和逐位相加的方式,可以高效地解决该问题。时间复杂度为 O(max(n, m)),其中 n 和 m 分别为两个链表的长度。
最开始我还以为是正常的相加呢,那不得麻烦死,还得反转列表。结果不需要,直接加就好,一下子容易太多了。另外学会了如何新建一个结点, struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));我就一直想为什么(ListNode*)malloc(sizeof(struct ListNode));为什么不对,原来是设置的就有问题。在代码中,dummy 和 current 的类型声明为 struct ListNode*,但在 malloc 和类型转换时,使用了 (ListNode*),这可能会导致编译错误。正确的类型转换应该是 (struct ListNode*)。

在C语言中,malloc 返回的是 void* 类型。虽然在某些编译器中,显式类型转换是允许的,但严格来说,这种转换是不必要的。如果你的编译器支持,可以去掉类型转换。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ResNet50深度解析:原理、结构与PyTorch实现

ResNet50深度解析&#xff1a;原理、结构与PyTorch实现 1. 引言 ResNet&#xff08;残差网络&#xff09;是深度学习领域的一项重大突破&#xff0c;它巧妙解决了深层神经网络训练中的梯度消失/爆炸问题&#xff0c;使得构建和训练更深的网络成为可能。作为计算机视觉领域的里…

政安晨【零基础玩转各类开源AI项目】Wan 2.1 本地部署,基于ComfyUI运行,最强文生视频 图生视频,一键生成高质量影片

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 尝试运行 依次下载模型 完成 我们今天要使…

每日一题----------String 和StringBuffer和StringBuiler重点

本质&#xff1a;是一个char字符数组存储字符串 总结&#xff1a; 1.如果字符串存在大量的修改操作&#xff0c;一般使用StringBuffer或者StringBuilder。 2.如果字符串存在大量的修改操作&#xff0c;并且单线程的情况&#xff0c;使用StringBuilder。 3.如果字符串存在大…

35.HarmonyOS NEXT Layout布局组件系统详解(二):AutoRow行组件实现原理

HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理 文章目录 HarmonyOS NEXT Layout布局组件系统详解&#xff08;二&#xff09;&#xff1a;AutoRow行组件实现原理1. AutoRow组件概述2. AutoRow组件接口定义3. AutoRow组件…

Java 集合框架大师课:集合框架源码解剖室(五)

&#x1f525;Java 集合框架大师课&#xff1a;集合框架源码解剖室&#xff08;五&#xff09; &#x1f4a3; 警告&#xff1a;本章包含大量 裸码级硬核分析&#xff0c;建议搭配咖啡因饮料阅读&#xff01;☕️ 第一章 ArrayList 的扩容玄学 1.1 动态扩容核心代码大卸八块 …

Kubernetes服务部署 —— Kafka

1、简介 Kafka和zookeeper是两种典型的有状态的应用集群服务。首先kafka和zookeeper都需要存储盘来保存有状态信息&#xff1b;其次kafka和zookeeper每一个实例都需要有对应的实例Id (Kafka需broker.id, zookeeper需要my.id) 来作为集群内部每个成员的标识&#xff0c;集群内节…

计算机网络基础知识

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

电脑的写字板如何使用?

打开写字板&#xff1a; 直接按一下键盘上的win R 键&#xff0c;然后输入&#xff1a;write &#xff0c; 再按一下回车 , 即可打开写字板 可以在里面写文字 和 插入图片等… &#xff0c; 如下所示&#xff1a; 保存写字板内容&#xff1a; 当我们写好了之后&#xff0c;…

用vector实现栈的功能

要注意pop_back和back()的区别 #include <bits/stdc.h> using namespace std;void Push(vector<int> &v,int x) {v.push_back(x); }void Top(vector<int> &v) {if(!v.empty()){cout<<v.back()<<endl;// v.pop_back();}else {cout<&l…

SegMAN模型详解及代码复现

SegMAN模型概述 模型背景 在深入探讨SegMAN模型之前&#xff0c;我们需要了解其研究背景。在SegMAN出现之前&#xff0c;计算机视觉领域的研究主要集中在以下几个方面&#xff1a; 手工制作方法&#xff0c;如SIFT基于卷积神经网络(CNN)的方法&#xff0c;如STN和PTN对平移、…

基于粒子群算法的配电网重构

一、配电网重构原理 定义&#xff1a; 配电网重构是指在满足运行约束的前提下&#xff0c;通过改变开关状态优化配电网性能&#xff0c;提高系统的经济效益和运行效率。 拓扑约束&#xff1a; 配电网必须保持径向拓扑&#xff0c;避免环网或孤岛。采用算法控制开关状态的选择&…

自然语言处理:无监督朴素贝叶斯模型

介绍 大家好&#xff0c;博主又来和大家分享自然语言处理领域的知识了&#xff0c;今天给大家介绍的是无监督朴素贝叶斯模型。 在自然语言处理这个充满挑战又极具魅力的领域&#xff0c;如何从海量的文本数据中挖掘有价值的信息&#xff0c;一直是研究者们不断探索的课题。无…

软件工程概述

软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析&#xff0c;任务是确定软件开发的总目标。 问题定义可行性研究&#xff08;经济、技术、操作、社会可行性&#xff0c;确定问题和解决办法&#xff09;需求分析&#xff08;确定功能需求&#xff0c;性…

基于51单片机的日历流水灯proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1lt1ubDhKNTeIcP0Kf1UXrA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

【Go沉思录】朝花夕拾:探究 Go 接口型函数

本文目录 序1.接口型函数案例方式1 GetterFunc 类型的函数作为参数方式2 实现了 Getter 接口的结构体作为参数价值 2.net/http包中的使用场景 序 之前写Geecache的时候&#xff0c;遇到了接口型函数&#xff0c;当时没有搞懂&#xff0c;现在重新回过头研究复习Geecache的时候…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台&#xff0c;后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码&#xff0c;这就是若依的强大之处&#xff0c;即便你不会Java和vue开发&#xff0c;只要跟着石头哥也可…

Java 线程与线程池类/接口继承谱系图+核心方法详解

Java 线程与线程池类/接口继承谱系图 1. 线程相关类与接口关系 #mermaid-svg-shTOx2cIkm79Zevf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shTOx2cIkm79Zevf .error-icon{fill:#552222;}#mermaid-svg-shTOx2cI…

BFS(十三)463. 岛屿的周长

463. 岛屿的周长 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰…

使用 Ansys Mechanical 和 optiSLang 进行材料模型校准

介绍 提供与实验数据匹配的准确仿真结果的材料模型是成功对实际应用进行 FEA 仿真的基础。根据实验数据校准材料模型是一个优化问题&#xff0c;其中仿真和真值信号之间的“距离”最小&#xff0c;表明模型与实验的“接近”程度。在此示例中&#xff0c;我们将对校准示例进行概…

SSA-朴素贝叶斯分类预测matlab代码

麻雀搜索算法&#xff08;Sparrow Search Algorithm&#xff0c;简称 SSA&#xff09;是于 2020 年提出的一种新兴群智能优化算法&#xff0c;其灵感主要来源于麻雀的觅食行为以及反捕食行为。 本次使用的数据是 Excel 格式的分类数据集数据。数据集被合理划分为训练集、验证集…