LeetCode:经典题之2、445 题解及延伸

系列目录

88.合并两个有序数组
52.螺旋数组
567.字符串的排列
643.子数组最大平均数
150.逆波兰表达式
61.旋转链表
160.相交链表
83.删除排序链表中的重复元素
389.找不同
1491.去掉最低工资和最高工资后的工资平均值
896.单调序列
206.反转链表
92.反转链表II
141.环形链表
142.环型链表
21.合并两个有序列表
24.两辆交换链表中的节点
876.链表的中间节点
143. 重排链表
2.两数相加
445.两数相加II


目录

  • 系列目录
  • 2. 两数相加
  • 445. 两数相加 II


2. 两数相加

🌟链表

原题链接


C++
若未特殊标明,以下题解均写用C++

/*** 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) {// 定义一个 tail 让其移动// 这里head 充当一个 💂ListNode *head = nullptr, *tail = nullptr;int carry = 0;// l1 或 l2 存在 while (l1 || l2 || carry) {// 这里不能写成——要进行一个 数据类型的转化// int sum = carry + l1->val + l2->val;int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = carry + n1 + n2;// head 不存在,初始化新链表if (!head) {// 小数点向前挪一位,只取个位,进位(十位)通过 carry记录head = tail = new ListNode(sum % 10);} else {tail->next = new ListNode(sum % 10);// 记得更新 tailtail = tail->next;}// 取整得到 carry 进位位 carry = sum / 10;if (l1) l1 = l1->next;if (l2) l2 = l2->next;}//	// l1 和 l2 都遍历完了 还有多余的进位//  if (carry > 0)//      tail->next = new ListNode(carry);// 这两行可以并在while中return head;}
};





445. 两数相加 II

🌟 (反转)链表+递归+栈

原题链接


思路
有了上一题的启发,我们可以先将逆序相加的两个链表,反转过来相加,再反转回去并返回


C++
若未特殊标明,以下题解均写用C++

方法一 反转链表+递归  
/*** 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 {
// class类 默认 private
//private:ListNode* reverseList(ListNode* head) {// pre-preserve	cur-current nxt-next        ListNode *pre = nullptr, *cur = head;while (cur) {ListNode *nxt = cur->next;cur->next = pre;pre = cur;cur = nxt;}return pre;}ListNode *addTwo(ListNode* l1, ListNode* l2) {ListNode *head = nullptr, *tail = nullptr;int carry = 0;while (l1 || l2) {int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = carry + n1 + n2;// 初始化新链表if (!head) {    head = tail = new ListNode(sum % 10);} else {tail->next = new ListNode(sum % 10);tail = tail->next;}// 更新进位位carry = sum / 10;// 别忘了更新 l1、l2if (l1) l1 = l1->next;if (l2) l2 = l2->next;}// 溢出的进位位处理if (carry > 0)tail->next = new ListNode(carry);return head;}public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {l1 = reverseList(l1);l2 = reverseList(l2);auto l3 = addTwo(l1, l2);// 将l1 和 l2 反转过来相加;再将所得的结果反转回去return reverseList(l3);}
};

写法二
/*** 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 {
private:ListNode* reverseList(ListNode* head) {// pre-preserve	cur-current nxt-next ListNode *pre = nullptr, *cur = head;while (cur) {ListNode *nxt = cur->next;cur->next = pre;pre = cur;cur = nxt;}return pre;}ListNode* addTwo(ListNode* l1, ListNode* l2) {int carry = 0;ListNode *tail = nullptr, *head = nullptr;while (l1 || l2 || carry) {int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = n1 + n2 + carry;if (!head) {head = tail = new ListNode(sum % 10);} else {tail->next = new ListNode(sum % 10);// 别忘了更新 tailtail = tail->next;}carry = sum / 10;if (l1) l1 = l1->next;if (l2) l2 = l2->next;} // while_endreturn head;}public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {l1 = reverseList(l1);l2 = reverseList(l2);auto l3 = addTwo(l1, l2);return reverseList(l3);}
};




思路:
借助栈逆序处理所有数位

方法二 栈
/*** 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) {stack<int> s1, s2;while (l1) {s1.push(l1->val);l1 = l1->next;}while (l2) {s2.push(l2->val);l2 = l2->next;}int carry = 0;// 用于 反转链表ListNode *res = nullptr;while (!s1.empty() or !s2.empty() or carry) {int a = s1.empty() ? 0 : s1.top();int b = s2.empty() ? 0 : s2.top();// 逻辑删除栈顶元素if (!s1.empty()) s1.pop();if (!s2.empty()) s2.pop();int sum = a + b + carry;carry = sum / 10;sum %= 10;// 可用 auto 代替 ListNode*auto node = new ListNode(sum);// 反转链表 node->next = res;res = node;}return res;}
};

  • 遵循后进先出(LIFO, Last In First Out)的原则
  • 主要用于存储数据元素,这些数据元素被称为栈项(Stack Items)

基本操作

  1. Push(推入):将一个新元素添加到栈的顶部
  2. Pop(弹出):从栈的顶部移除一个元素,并返回该元素的值 如果栈为空,则弹出操作可能会失败或引发错误
  3. Top(顶部):返回栈顶元素的值,但不移除它
  4. IsEmpty(是否为空):检查栈是否为空
  5. Size(大小):返回栈中元素的数量

实现

栈可以用数组或链表来实现 在C++中,通常使用标准模板库(STL)中的std::stack容器来实现栈

应用

栈在计算机科学中有广泛的应用,包括函数调用(调用栈)、表达式求值(如后缀表达式)、括号匹配、深度优先搜索(DFS)等 在操作系统中,栈也用于保存局部变量和返回地址 在C++中,当函数被调用时,其参数和局部变量通常被存储在调用栈上

示例:

#include <iostream>  
#include <stack>  int main() {  std::stack<int> myStack; // 创建一个空的int类型栈  // Push元素到栈中  myStack.push(1);  myStack.push(2);  myStack.push(3);  // 显示栈顶元素  std::cout << "栈顶元素: " << myStack.top() << std::endl; // 输出: 3  // 弹出并显示栈顶元素  std::cout << "弹出的元素: " << myStack.pop() << std::endl; // 输出: 3  // 显示栈的大小  std::cout << "栈的大小: " << myStack.size() << std::endl; // 输出: 2  // 检查栈是否为空  if (myStack.empty()) {  std::cout << "栈为空" << std::endl;  } else {  std::cout << "栈不为空" << std::endl; // 输出: 栈不为空  }  return 0;  
}

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

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

相关文章

C++中常用库文件的使用

chrono::steady_clock::time_point last_rfid_time; 这条语句涉及C标准库中的Chrono库&#xff0c;用于处理时间和时钟。具体地&#xff0c;这条语句声明了一个类型为chrono::steady_clock::time_point的变量last_rfid_time。下面是详细的解释&#xff1a; 1. chrono chron…

第十二次作业

3.maven的基本原理和使用 maven&#xff1a;是一款管理和构建java项目的工具 3.1作用 1.依赖管理-方便快捷的管理项目管理&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题。2。统一项目结构-提供标准&#xff0c;统一的项目结构。main-实际项目资源。java-java源…

FastAPI和APIRouter

在FastAPI框架中&#xff0c;app FastAPI() 和 router APIRouter() 分别代表了应用的两个核心构建块&#xff0c;它们在构建API时扮演着不同的角色&#xff1a; 1、app FastAPI() 这行代码是创建FastAPI应用实例的起点。FastAPI 类是FastAPI框架的核心&#xff0c;它继承自…

小型智能驱鸟器,建筑驱鸟专用

随着城市化进程的加快&#xff0c;鸟类与人类的居住空间逐渐交织重合&#xff0c;鸟类对建筑物的侵扰问题也愈发凸显。家庭庭院、住宅窗前、屋顶&#xff0c;甚至那些承载着历史与文化底蕴的名胜古迹和精美雕像&#xff0c;都时常受到鸟粪的污染。鸟粪具有腐蚀性且很难清理&…

课题推荐系统介绍

课题推荐系统介绍 课题推荐系统是一种基于推荐算法和自然语言处理技术&#xff0c;自动化地为用户推荐符合其兴趣和需求的研究课题的系统。该系统通过分析用户的输入&#xff08;如类别、领域和关键字&#xff09;&#xff0c;结合大数据和人工智能技术&#xff0c;从庞大的课…

应用监控pinpoint调研

参考 https://blog.csdn.net/Rose_juvenile/article/details/135285508?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-135285508-blog-132330996.235^v43^pc_blog_bottom_relevance_base6&spm1001.2101.3001.4242.1&a…

数据库数据目录磁盘扩展,物理卷扩展为逻辑卷

背景&#xff0c;之前的 pg 数据库数据目录使用的是物理盘&#xff0c;不支持扩展&#xff0c;随着数据增大&#xff0c;磁盘空间告警&#xff0c;现在需要将新的磁盘制作成逻辑卷&#xff0c;以便之后扩展使用。 之前使用的数据目录为 /u01 停止数据库 停止数据库 停止数据…

Windows中配置python3.11环境安装教程

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、软件的下载和安装2.1 下载2.2 安装2.3 验证安装结果 三、最后 开篇说明 应要求为…

Java变量与标识符

一、关键字&#xff08;Keyboard&#xff09; 定义&#xff1a;被Java语言赋予了特殊含义&#xff0c;用做专门用途的字符串&#xff08;或单词&#xff09; 特点&#xff1a;全部关键字都是小写字母 官方地址&#xff1a; https://docs.oracle.com/javase/tutorial/java/nut…

DB-GPT Docker部署

感谢阅读 拉取镜像linux判断拉取是否成功的方法windows判断拉取是否成功的方法 模型以及启动容器模型启动容器 界面如下&#xff08;0.56&#xff09;&#xff1a; 拉取镜像 docker pull eosphorosai/dbgpt:latestlinux判断拉取是否成功的方法 docker images | grep "eo…

龙国南方航空滑块acw_v2+cookie+风控处理+type后缀

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁…

中小企业的数字化转型业务场景落地案例

引言&#xff1a;随着商业活动的复杂化和全球化程度的提高&#xff0c;合同作为商业交易的重要组成部分&#xff0c;其数量、条款和复杂性都在不断增加。企业面临着越来越多的合同管理挑战&#xff0c;包括合同数量增多、条款繁琐、文件分散存储等问题。而中小企业由于管理不到…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…

C++学习笔记:C++基础语法+编程思想

C基础 参考&#xff1a;C 教程 | 菜鸟教程 (runoob.com) 用于部署、opencv 学习内容&#xff1a;编程核心部分 学习要求&#xff1a;能读懂代码&#xff0c;复现代码 python&#xff1a;语言简洁&#xff0c;用于解决数据分析问题 面向对象&#xff1a;一种程序的编程思维&…

leecode 111.简单题 给定一个二叉树,计算二叉树的最小深度

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 叶子节点是指没有子节点的节点 class Solution {public int minDepth(TreeNode root) {/**第一反应是通过一个递归解决&#xff1b;*/if(root null){return 0;}int lmd minDepth(root.left);int rmd minDepth(roo…

MYSQL存储过程的创建

关于存储过程的题目 1、创建存储过程,查看user表中的所有数据 2、创建存储过程avg_order_quantity,返回所有订单的平均工资 3、创建存储过程show_max_bprice,用来查看bookS的单价最贵的价格 4、创建存储过程show_min_bprice,用来查看bookS的单价最低的价格&#xff0c;并将…

JVM之双亲委派机制

1.双亲委派机制 在Java中&#xff0c;类加载器具有层次结构。每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器&#xff08;parent&#xff09;&#xff0c;可以理解为上级&#xff0c;并不是继承关系。应用程序类加载器的parent父加载器是扩展类加载器&#xff0…

ulimit报错

问题 执行命令“ulimit -c 2048 ”时报错&#xff1a;“bash: ulimit: core file size: cannot modify limit: Operation not permitted” 原因 权限不够。 解决办法 执行命令“sudo gedit /etc/security/limits.conf”打开文件limits.conf文件内添加内容如下&#xff1a;…

在 Java 中从 for 循环中移出元素的原理及解决方案

在 Java 中从 for 循环中移出元素的原理及解决方案 在 Java 编程中&#xff0c;从集合中移除元素是常见操作。然而&#xff0c;直接在 for 循环中删除或移出元素往往会导致 ConcurrentModificationException&#xff08;数组下标越界&#xff09;。本文将详细解释这种情况发生…

【索引】数据库索引之散列索引

目录 1、什么是散列&#xff1f; 2、如何评价一个散列函数的好坏&#xff1f; 3、散列中的桶溢出处理 4、散列在索引中的应用 4、顺序索引和散列索引的比较 1、什么是散列&#xff1f; 顺序文件组织的一个缺点是我们必须访问索引结构来定位数据&#xff0c;或者必须使用二…