【算法】链表:2.两数相加(medium)+模拟

ops/2024/10/21 9:57:20/

 系列专栏

《分治》

《模拟》

《Linux》


目录

1、题目链接 

2、题目介绍

3、解法 (模拟)

4、代码


 

1、题目链接 

2. 两数相加 - 力扣(LeetCode)

2、题目介绍

3、解法 (模拟)

  1. 理解题目要求
    • 我们有两个链表,每个链表代表一个逆序存储的非负整数。
    • 我们需要将这两个数相加,并以相同的形式(逆序链表)返回结果。
  2. 初始化
    • 创建两个指针 cur1 和 cur2 分别指向两个链表的头节点。
    • 创建一个新的链表 l3 来存储结果,并且为了方便操作,我们使用一个哑节点 dummy,其 next 指向 l3。哑节点的作用是方便处理边界情况,最后返回结果时只需返回 dummy->next
    • 初始化一个变量 num 来保存进位值,初始为 0。
  3. 遍历链表
    • 使用一个 while 循环来遍历两个链表,条件是 cur1 或 cur2 不为空,或者 num(进位值)不为 0。
    • 在每次循环中,如果 cur1 为空,则将 a 设为 0;如果 cur2 为空,则将 b 设为 0。这样做是为了处理链表长度不一致的情况。
    • 计算当前位的和 sum = a + b + num
  4. 处理进位和创建新节点
    • 计算新的进位值 num = sum / 10
    • 计算当前位的值 sum %= 10,这是实际要添加到结果链表中的值。
    • 在 l3 后面创建一个新节点,其值为 sum,然后移动 l3 指针到这个新节点。
  5. 移动指针
    • 如果 cur1 不为空,将其移动到下一个节点。
    • 如果 cur2 不为空,将其移动到下一个节点。
  6. 返回结果
    • 循环结束后,返回 dummy->next,即跳过了哑节点,返回的是实际存储结果的链表的头节点。

这种方法的时间复杂度是 O(max(m, n)),其中 m 和 n 分别是两个链表的长度,因为我们最多遍历两个链表各一次。空间复杂度是 O(max(m, n)),因为我们需要创建一个新的链表来存储结果,其长度最多与较长的链表相同。

4、代码

/*** 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* cur1 = l1;ListNode* cur2 = l2;ListNode* l3 = new ListNode(0);//新链表,创建一个头节点ListNode* dummy = l3;int num = 0;while (cur1 != NULL || cur2 != NULL || num)    //需要考虑进位,加到最后,有进位还需要进一步创建新的节点{int sum = 0;//每位上的求和int a = cur1 == nullptr ? 0 : cur1->val;int b = cur2 == nullptr ? 0 : cur2->val;sum = a + b + num;//加上,上一次和的进位(0/1)//处理进位num = sum / 10;sum %= 10;//无论是否进位,%都不影响结果//添加元素l3->next = new ListNode(sum);l3 = l3->next;if(cur2!=NULL)cur2 = cur2->next;if (cur1 != NULL)cur1 = cur1->next;}return dummy->next;}
};


http://www.ppmy.cn/ops/123392.html

相关文章

LeetCode讲解篇之1143. 最长公共子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以采用动态规划求解&#xff0c;用一个二维数组记录text1的0 ~ i区间子串和text2的0 ~ j区间子串的最长公共子序列的长度&#xff0c;我们假设该二维数组是f 这个数组有一个特性&#xff0c;如果a <…

MyBatis之TypeHandler的自定义实现

文章目录 一、TypeHandler概述二、TypeHandler的工作原理1.设置参数&#xff08;Parameter Setting&#xff09;2.获取结果&#xff08;Result Getting&#xff09;3.类型映射和转换规则4.自定义TypeHandler的扩展性 三、自定义的具体实现业务场景分析需求具体实现 一、TypeHan…

数据结构——排序(交换排序)

目录 一、交换排序的总体概念 二、冒泡排序 三、快速排序 1.挖坑法 2.左右指针 3.前后指针 一、交换排序的总体概念 交换排序是一类排序算法&#xff0c;它的核心思想是通过交换元素的位置来达到排序的目的。在排序过程中&#xff0c;比较数组中的元素对&#xff0c;如果…

RTC -

RTC 目录 RTC 回顾 RTC 如何实现RTC制作一个时钟日历 代码编写 rtc.c完整代码 模块开发的步骤&#xff1a; 1、找文档 2、 在文档里面找通信方式&#xff0c;通信过程&#xff08;协议&#xff09; 3、代码> -- 前面学的是模块的开发&#xff0c;串口类&#xff0c;I…

Expectation-Maximization Algorithm(EM算法)

EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09;是一种迭代优化算法&#xff0c;主要用于在含有隐变量&#xff08;未观测变量&#xff09;或不完全数据的概率模型中&#xff0c;估计参数的最大似然估计&#xff08;Maximum Like…

初学Java基础Day15---面相对象之this,static关键字,静态代码块

一&#xff0c;this关键字 1.概念&#xff1a; 表示本对象 2.理解&#xff1a; 哪个对象调用该方法&#xff0c;该方法里的this就表示该对象 3.作用&#xff1a; 1.this.属性 &#xff1a; 调用本对象的成员属性 2.this.方法 &#xff1a; 调用本对象的成员方法 3.this() : …

初识JAVA

初识Java 1、Java的优点 跨平台&#xff0c;简单&#xff0c;安全&#xff0c;健壮&#xff0c;面向对象 2、Java的核心优势 跨平台 Java的跨平台原理 1、.class:二进制的&#xff0c;结构中立&#xff0c;平台独立&#xff0c;字节编码文件&#xff1a;bytecode。 2、Java跨…

SeaboxSQL

目录 一、基本架构 0、数据模型 1、主从集群 2、分库分表 二、部署安装 1、配置要求 2、前置依赖 3、安装步骤 三、基本操作 1、实例启停 2、命令执行 3、基本查询 4、表空间管理 4、用户管理 6、数据库操作 7、SCHEMA操作 8、表操作 9、日志操作 &…