当前位置: 首页 > news >正文

Leetcode力扣解题记录--第2题(加法模拟)

题目链接:2. 两数相加 - 力扣(LeetCode)

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 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. 同步遍历:我们同时从两个链表的头节点(即数字的最低位)开始遍历。

  2. 逐位相加:在每一步中,我们将两个链表当前节点的值与上一步产生的**进位(carry)**相加。

    • 当前位总和 = l1当前节点值 + l2当前节点值 + carry

  3. 计算新节点值和新进位

    • 放入新链表中的节点值应该是总和的个位数,即 当前位总和 % 10。

    • 新的进位则是总和的十位数,即 当前位总和 / 10,这个进位会用于下一位的计算。

  4. 构建新链表:我们创建一个新的链表来存储结果。为了方便操作,我们可以使用一个“哑节点”(dummy head)作为新链表的伪头节点,并用一个 current 指针来追踪新链表的尾部,以便于添加新节点。

  5. 处理长短不一和最后进位

    • 如果一个链表比另一个长,当短的链表遍历结束后,我们视其为空,其节点值为0,继续与长链表的剩余部分和进位相加。

    • 遍历的循环条件应该是两个链表都不为空,或者进位不为0。这确保了在两个链表都遍历完后,如果还有一个最后的进位(例如 99 + 1 = 100),我们能把这个进位 1 作为最高位添加到结果链表中。

通过这个过程,我们就能完整地模拟两个逆序数字的相加,并生成一个符合要求的结果链表。

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 创建一个哑节点,方便处理链表头部的插入ListNode* dummyHead = new ListNode(0);ListNode* current = dummyHead;// carry 用于存储进位int carry = 0;// 循环条件:只要l1或l2没有遍历完,或者还有进位,就继续while (l1 != nullptr || l2 != nullptr || carry != 0) {// 获取l1和l2当前节点的值,如果节点为空则视为0int val1 = (l1 != nullptr) ? l1->val : 0;int val2 = (l2 != nullptr) ? l2->val : 0;// 计算当前位的总和int sum = val1 + val2 + carry;// 更新进位,为下一次计算做准备carry = sum / 10;// 创建新节点,值为总和的个位数,并链接到结果链表current->next = new ListNode(sum % 10);// 移动current指针到新链表的尾部current = current->next;// 移动l1和l2的指针if (l1 != nullptr) {l1 = l1->next;}if (l2 != nullptr) {l2 = l2->next;}}// 哑节点的下一个节点是结果链表的真正头节点ListNode* resultHead = dummyHead->next;delete dummyHead; // 释放哑节点的内存return resultHead;}
};

 

http://www.dtcms.com/a/295539.html

相关文章:

  • (进阶向)Python第十四期OpenCv图像预处理方法[2]
  • ModernBERT如何突破BERT局限?情感分析全流程解析
  • 输电线路微气象在线监测装置:保障电网安全的科技屏障
  • Text2SQL智能问答系统开发(一)
  • 成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能
  • C++抽象类完全指南
  • 三坐标测量仪高效批量检测轴类传动零件
  • 基于深度学习的图像分类:使用EfficientNet实现高效分类
  • 基础NLP | 常用工具
  • DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成
  • 机器翻译编程
  • Unity是如何把3D场景显示到屏幕上的——Unity的渲染过程
  • 实战演练—基于Transformers的NLP解决方案总结
  • Python实现PDF按页分割:灵活拆分文档的技术指南
  • 【Rust线程】Rust高并发编程之线程原理解析与应用实战
  • K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
  • 【REACT18.x】CRA+TS+ANTD5.X封装自定义的hooks复用业务功能
  • 初识opencv03——图像预处理2
  • C++vector(2)
  • TreeMap一致性哈希环设计与实现 —— 高可用的数据分布引擎
  • 【RAG优化】RAG应用中图文表格混合内容的终极检索与生成策略
  • 【AI】Jupyterlab中打开文件夹的方式
  • 元宇宙工厂网页新形态:3D场景嵌入与WebGL交互的轻量化实现
  • MySQL 表的操作
  • 奇异值分解(Singular Value Decomposition, SVD)
  • 武汉火影数字|数字党建展厅制作 VR红色数字纪念馆 党史馆数字化打造
  • Windows 10 远程桌面(RDP)防暴力破解脚本
  • Linux内核中动态内存分配函数解析
  • 滑动窗口机制及其应用
  • 云渲染的算力困局与架构重构:一场正在发生的生产力革命