每日一题——两数相加

两数相加

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

问题描述

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

示例:

  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.mzph.cn/bicheng/73058.shtml

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

相关文章

制作自定义镜像

1. 确定软件包 确定自己的环境都需要哪些命令&#xff0c;然后&#xff0c;从镜像文件或者yum源下载响应的安装包。 bash基本是必选的 &#xff08;bash-5.1.8-10.oe2203sp2.aarch64.rpm&#xff09; vim也是有必要的 &#xff08;vim-enhanced-9.0-15.oe2203sp2.aarch64.rpm…

WHAT - 前端性能指标

目录 核心 Web Vitals&#xff08;Core Web Vitals&#xff09;加载性能指标网络相关指标交互和响应性能指标内存与效率指标推荐的监控工具优化策略与建议推荐学习路线 作为前端开发者&#xff0c;理解并掌握关键的性能指标对优化 Web 应用至关重要。 以下是前端性能优化中常见…

C++20 模块:告别头文件,迎接现代化的模块系统

文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…

Apache Hudi 性能测试报告

一、测试背景 数据湖作为一个集中化的数据存储仓库,支持结构化、半结构化以及非结构化等多种数据格式,数据来源包含数据库数据、增量数据、日志数据以及数仓上的存量数据等。数据湖能够将这些不同来源、不同格式的数据集中存储和管理在高性价比的分布式存储系统中,对外提供…

sql靶场5-6关(报错注入)保姆级教程

目录 sql靶场5-6关&#xff08;报错注入&#xff09;保姆级教程 1.第五关 1.步骤一&#xff08;闭合&#xff09; 2.步骤二&#xff08;列数&#xff09; 3.报错注入深解 4.报错注入格式 5.步骤三&#xff08;数据库表名&#xff09; 6.常用函数 7.步骤四&#xff08;表…

OSPF-单区域的配置

一、单区域概念&#xff1a; 单区域OSPF中&#xff0c;整个网络被视为一个区域&#xff0c;区域ID通常为0&#xff08;骨干区域&#xff09;。所有的路由器都在这个区域内交换链路状态信息。 补充知识点&#xff1a; OSPF为何需要loopback接口&#xff1a; 1.Loopback接口的…

LeetCode100之二叉树的直径(543)--Java

1.问题描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例1 输入&#xff1a;root [1,2,3,4,5] 输出&#…

C语言每日一练——day_4

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第四天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

工作流编排利器:Prefect 全流程解析

工作流编排利器&#xff1a;Prefect 全流程解析 本文系统讲解了Prefect工作流编排工具&#xff0c;从基础入门到高级应用&#xff0c;涵盖任务与流程管理、数据处理、执行器配置、监控调试、性能优化及与其他工具集成等内容&#xff0c;文末项目实战示例&#xff0c;帮助读者全…

Web Workers 客户端 + 服务端应用

一. Web Workers 客户端应用 使用 JavaScript 创建 Web Worker 的步骤如下&#xff1a; 1.创建一个新的 JavaScript 文件&#xff0c;其中包含要在工作线程中运行的代码&#xff08;耗时任务&#xff09;。该文件不应包含对 DOM 的引用&#xff0c;因为在工作线程中无法访问 …

大模型工具Ollama存在安全风险

国家网络安全通报中心&#xff1a;大模型工具Ollama存在安全风险 来源&#xff1a;国家网络与信息安全信息通报中心 3月3日&#xff0c;国家网络安全通报中心发布关于大模型工具Ollama存在安全风险的情况通报&#xff0c;内容如下&#xff1a; 据清华大学网络空间测绘联合研…

LINUX系统安装+添加共享目录

一、前言 Windows或mac系统中创建Linux工作环境是基于VMware和SL(Scientific Linux)&#xff0c;下面分别安装二者。 二、VMware软件安装及注册 1、双击VMware安装包 2、点击下一步 3、 勾选接受许可&#xff0c;并点击下一步 4、更改路径&#xff08;建议更改为容易找到的路…

BI 工具响应慢?可能是 OLAP 层拖了后腿

在数据驱动决策的时代&#xff0c;BI 已成为企业洞察业务、辅助决策的必备工具。然而&#xff0c;随着数据量激增和分析需求复杂化&#xff0c;BI 系统“卡”、“响应慢”的问题日益突出&#xff0c;严重影响分析效率和用户体验。 本文将深入 BI 性能问题的根源&#xff0c;并…

基于SSM+Vue的汽车维修保养预约系统+LW示例

1.项目介绍 系统角色&#xff1a;管理员、员工、用户功能模块&#xff1a;用户管理、员工管理、汽车类型管理、项目类型管理、维修/预约订单管理、系统管理、公告管理等技术选型&#xff1a;SSM&#xff0c;vue&#xff08;后端管理web&#xff09;&#xff0c;Layui&#xff…

在rocklinux里面批量部署安装rocklinx9

部署三台Rockylinux9服务器 实验要求 1. 自动安装ubuntu server20以上版本 2. 自动部署三台Rockylinux9服务器&#xff0c;最小化安装&#xff0c;安装基础包&#xff0c;并设定国内源&#xff0c;设静态IP 实验步骤 安装软件 # yum源必须有epel源 # dnf install -y epel-re…

Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)

背景&#xff1a;问题如上标题&#xff0c;H3C所有交换机配置的model都是comware 解决方案&#xff1a; 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…

mac本地安装运行Redis-单机

记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了&#xff0c;只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址&#xff1a;https://git…

C++学习之格斗小游戏综合案例

C格斗游戏效果视频 1.案例简介 #include "broadSword.h" //构造函数 BroadSword::BroadSword() { FileManager fm; map<string, map<string, string>> mWeapon; fm.loadCSVData("Weapons.csv", mWeapon); //武器id string id …

《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》

导语​ "你是否想过用Python开发一款可玩性高的双人合作游戏&#xff1f;本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏&#xff01;包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点&#xff0c;文末提供完整代码包下载&#xff01;" 哈…

【理想解法学习笔记】

目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是&#xff1a;首先建立初始化决策矩阵&#xff0c;而后基于规范化后的初…