【力扣】两数相加,模拟+递归

两数相加原题地址

方法一:模拟

注意到链表的方向是从低位到高位,而做“竖式相加”也是低位到高位。

   1 2 3

+    4 5

-----------

   1 6 8

所以可以用同样的方法来模拟。如果不考虑进位,只需要取出对应位的2个数相加,再尾插到新的链表中。

62579ab31c1e4ef1aeeef20462b7fe80.png

注意新的链表也是从低位到高位,也就是按照8->6->1的方向存储。链表中不存在前置0,所以当其中一个链表遍历完了,另一个链表没遍历完的时候,遍历完的链表剩下的元素都当做前置0来处理。

实际计算时,还会出现进位的情况,所以需要一个变量carry来存储进位值,这个变量要定义在循环外面,因为下一次进入循环后不能销毁,计算时需要加上进位值。最终需要存储在新链表的元素就是(n1+n2+carry)mod10。其中n1和n2为两个链表中取出来的值,如果其中一个链表走到头了当做前置0处理。另外,新的进位值为(n1+n2+carry)/10。

需要注意尾插时对于新链表是否为空的分类讨论。如果新链表为空,需要对头结点重新赋值,否则直接在尾部插入即可。为了防止尾插时的找尾操作效率太低,最好定义一个尾指针存储尾部的节点地址。

最后一次循环走完后,如果carry不为0,记得还需在尾部插入一个1,这点非常容易出错。

// 方法一:模拟
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 由于要反复尾插,最好定义一个指针存储尾节点的地址ListNode* head = nullptr, * tail = nullptr;int carry = 0; // 进位,必须定义在循环外面,下次循环还能用// 两条链表都走完才结束while (l1 || l2){// 如果链表走完了,剩下的数为前置0// 1 <- 2 <- 3 <- 4 <- 5// 0 <- 0 <- 6 <- 7 <- 8int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = n1 + n2 + carry;carry = sum / 10;// 尾插,是否为空链表要分类讨论if (!head){head = tail = new ListNode(sum % 10);}else{tail->next = new ListNode(sum % 10);tail = tail->next;}if (l1){l1 = l1->next;}if (l2){l2 = l2->next;}}if (carry){tail->next = new ListNode(1);}return head;}
};

方法二:递归

对于链表的题目,自然会想到递归。根据模拟法的思路,影响插入元素的因素为两个链表取出来的值以及进位值,及(l1, l2, carry)。如果要改为递归实现,我们需要把问题转换为:当前需要插入的值(n1+n2+carry)mod10,以及子问题(当前需要插入的值后面需要插入什么呢?)

子问题的解决很简单,只需要在当前节点后面插入由子问题(l1的下一个节点, l2的下一个节点, carry)构成的链表。这么说有点抽象,看图:

0055b339bf6c415a86742f8f1e5b8449.png

c64216c492f0444f941c69819c2ca94a.png

递归结束的条件是什么呢?自然是两个链表都走完了,而且没有进位。

// 方法二:递归
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {return _addTwoNumbers(l1, l2, 0);}ListNode* _addTwoNumbers(ListNode* l1, ListNode* l2, int carry){// 链表都为空且无进位,终止递归if (!l1 && !l2 && carry == 0){return nullptr;}// 链表非空,则取值相加int n1 = 0;int n2 = 0;if (l1){n1 = l1->val;l1 = l1->next;}if (l2){n2 = l2->val;l2 = l2->next;}int sum = n1 + n2 + carry;carry = sum / 10;// 链接上新的节点,继续递归至下一层ListNode* node = new ListNode(sum % 10);node->next = _addTwoNumbers(l1, l2, carry);return node;}
};

 

 

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

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

相关文章

微信小程序学习指南:从基础知识到代码展示

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Visual Studio 2010+C#实现信源和信息熵

1. 设计要求 以图形界面的方式设计一套程序&#xff0c;该程序可以实现以下功能&#xff1a; 从输入框输入单个或多个概率&#xff0c;然后使用者可以通过相关按钮的点击求解相应的对数&#xff0c;自信息以及信息熵程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算…

《Git 简易速速上手小册》第4章:Git 与团队合作(2024 最新版)

文章目录 4.1 协作流程简介4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;为 Python Web 应用添加新功能4.1.3 拓展案例 1&#xff1a;使用 CI/CD 流程自动化测试4.1.4 拓展案例 2&#xff1a;处理 Pull Request 中的反馈 4.2 使用 Pull Requests4.2.1 基础知识讲解4.2.2 重点案…

CCF-B类COLT’24 2月9日截稿!春节也是创新季!学术思维不休假!

会议之眼 快讯 第37届COLT( Conference on Learning Theory)即国际学习理论大会将于 2024 年 6月30日至7月3日在加拿大埃德蒙顿隆重举行&#xff01;COLT是机器学习重要的国际会议之一&#xff0c;专注于机器学习理论方向。作为机器学习领域的重要学术盛会&#xff0c;COLT聚集…

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代&#xff0c;增强现实&#xff08;AR&#xff09;技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累&#xff0c;为企业提供了一套创新的AR特效自研AI算法技术解决方案&#xff0c;旨在满足企业在AR领域的多元化需求。…

Python接口自动化测试框架运行原理及流程

这篇文章主要介绍了Python接口自动化测试框架运行原理及流程,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框…

Linux系统编程

目录 前言&#xff1a; 一、 并发 单轨道和多轨道程序设计 单轨道&#xff1a; 多轨道&#xff1a; 二、进程 1.概念&#xff1a; 2.进程状态&#xff1a; 状态转换图 3.进程特点&#xff1a; 4.PCB进程控制块 PCB 进程控制块和文件描述符表 三、虚拟地址空间 …

JavaScript中闭包的定义、原理及应用场景

JavaScript是一门以函数为核心的编程语言&#xff0c;其独特的闭包特性是众多开发者所喜爱的特点之一。闭包是一种非常强大的概念&#xff0c;可以帮助我们实现许多复杂的功能和逻辑。本篇博客将为大家深入介绍JavaScript中闭包的定义、原理及应用场景&#xff0c;并通过示例代…

svg基础(三)分组、渐变

上一篇文章简单介绍了svg常用标签及其属性,本篇主要介绍分组&#xff0c;渐变 1 分组<g> 分组容器 添加到g元素上的变换会应用到其所有的子元素上添加到g元素的属性会被其所有的子元素继承定义复杂对象&#xff0c;可通过<use>元素引用 1.1 分组 <svg>&…

市场复盘总结 20240206

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 今日梯队&#xff1a; 二进三&#xff1a…

CF1404BTree Tag/ BZOJ0487. 树上追逐详解

1.题目 传送门:Tree Tag - 洛谷 2.思路 我们考虑什么情况下Alice可以获胜. 如果​ ≤ da&#xff0c;则Alice可以一步就追上Bob. 如果Alice处在一个能覆盖整棵树的点&#xff0c;即2da 1≥树的直径&#xff0c;那么Bob也无论走到哪里Alice都能追到,Alice获胜. 其它情况下…

阿里云企业用户2核4G5M固定带宽199元一年,续费不涨价

2024年2月阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核…