LeetCode两数相加

embedded/2024/10/21 0:44:13/

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

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

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

这个问题是经典的“链表相加”问题。两个链表中的每个节点都存储一个数字,它们按照逆序存储,也就是说最低位数字存储在链表的头部。我们需要对链表中的数字进行逐位相加,并将结果也以链表的形式返回。

解题思路

我们可以使用逐位相加的方式来解决问题,并且需要考虑进位

具体步骤

  1. 遍历两个链表

    • 我们从两个链表的头部开始,逐位相加两个数,同时考虑前一位的进位情况。
    • 如果当前位的和大于或等于10,则产生进位。
  2. 进位处理

    • 当两个链表都遍历完后,如果还有进位,需要在结果链表的最后再加上一个节点来存储该进位。
  3. 特殊情况处理

    • 如果某个链表比另一个链表长,则在较短链表遍历完后,只需继续将长链表的剩余部分与进位相加。
  4. 返回结果链表

    • 结果链表也是按照逆序存储的形式输出。

Java代码实现

// 定义链表节点
class ListNode {int val;  // 节点的值ListNode next;  // 指向下一个节点的指针// 构造函数ListNode(int val) {this.val = val;}
}public class AddTwoNumbers {/*** 将两个链表表示的数字相加,并返回结果链表** @param l1 链表1* @param l2 链表2* @return 结果链表*/public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummyHead = new ListNode(0); // 虚拟头节点ListNode curr = dummyHead;int carry = 0;  // 进位// 遍历两个链表while (l1 != null || l2 != null) {int x = (l1 != null) ? l1.val : 0;int y = (l2 != null) ? l2.val : 0;int sum = carry + x + y; // 当前位的和carry = sum / 10; // 更新进位curr.next = new ListNode(sum % 10); // 创建新节点存储当前位的值curr = curr.next; // 移动到下一个节点// 移动链表指针if (l1 != null) l1 = l1.next;if (l2 != null) l2 = l2.next;}// 如果最后有进位,创建新节点存储进位if (carry > 0) {curr.next = new ListNode(carry);}return dummyHead.next; // 返回结果链表的头节点}public static void main(String[] args) {// 创建链表1: 2 -> 4 -> 3 表示数字342ListNode l1 = new ListNode(2);l1.next = new ListNode(4);l1.next.next = new ListNode(3);// 创建链表2: 5 -> 6 -> 4 表示数字465ListNode l2 = new ListNode(5);l2.next = new ListNode(6);l2.next.next = new ListNode(4);// 调用addTwoNumbers方法ListNode result = addTwoNumbers(l1, l2);}
}

代码解释

  1. ListNode 类

    • ListNode 是一个简单的链表节点类,每个节点包含一个整数 val 和一个指向下一个节点的指针 next
  2. addTwoNumbers 方法

    • 该方法接收两个链表 l1l2,表示两个逆序存储的数字。
    • dummyHead 是一个虚拟头节点,它的目的是简化链表操作(比如插入新节点),最后返回 dummyHead.next 即为结果链表的头节点。
    • carry 用于存储相加时的进位。
    • 使用 while 循环逐位相加 l1l2,直到遍历完所有节点。
  3. 进位处理

    • 如果 carry > 0,意味着最后还有进位,需要在结果链表的尾部再加上一个节点。
  4. 示例

    • main 方法中,创建了两个链表 l1l2,分别表示数字 342 和 465。相加的结果为 807,对应的链表形式为 7 -> 0 -> 8

时间复杂度和空间复杂度

  • 时间复杂度O(max(m, n)),其中 mn 分别是两个链表的长度。我们需要遍历两个链表的所有节点。
  • 空间复杂度O(max(m, n)),用于存储结果链表的节点。

总结

这道题的关键在于链表的逐位相加和进位处理。通过使用虚拟头节点来简化链表操作,并且在遍历时考虑进位问题,我们可以高效地解决这个问题。


http://www.ppmy.cn/embedded/129137.html

相关文章

Gin框架操作指南08:日志与安全

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…

MongoDB聚合管道(Aggregation Pipeline)

聚合管道(Aggregation Pipeline)是MongoDB中用于对数据进行处理和分析的一种强大机制。它由一系列的阶段(Stage)组成,每个阶段对输入的数据进行一种特定的操作,然后将结果传递给下一个阶段,就像…

Linux安装 php5.6

Linux安装 php5.6.30 下载-解压-配置-安装 下载到 /usr/local wget http://am1.php.net/distributions/php-5.6.30.tar.gztar -zxvf php-5.6.30.tar.gz cd php-5.6.30#编译配置 ./configure --prefix/usr/local/php --with-curl/usr/local/curl --with-freetype-dir --wit…

【算法日记】力扣239 滑动窗口最大值

题目描述 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,…

已解决:ModuleNotFoundError: No module named ‘pip‘

[已解决] ModuleNotFoundError: No module named ‘pip‘ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 手动安装或升级 pip2. 使用 get-pip.py 脚本3. 检查环境变量配置4. 重新安装 Python 并确保添加到 PATH5. 在虚拟环境中安装 pip6. 使用 conda 安装 pip&…

持续科技创新 高德亮相2024中国测绘地理信息科技年会

图为博览会期间, 自然资源部党组成员、副部长刘国洪前往高德企业展台参观。 10月15日,2024中国测绘地理信息科学技术年会暨中国测绘地理信息技术装备博览会在郑州召开。作为国内领先的地图厂商,高德地图凭借高精度高动态导航地图技术应用受邀参会。 本…

Windows电脑桌面如何弄个好用的提醒备忘录?

在这个充满挑战的时代,每个人都渴望成为更好的自己。然而,随着生活节奏的加快,我们时常发现自己陷入了各种琐事之中,难以脱身。为了不让重要的事情被遗漏,一款好的提醒备忘录工具就显得尤为关键。那么,Wind…

jmeter中用csv data set config做参数化2

在jmeter中,使用csv data set config进行参数化是很重要的一个功能,但是这个功能的使用需要十分仔细和小心,因为细节之处往往决定着结果的正确与否。 举例: 一个登录接口用加密密码登录,一个登录接口用原始密码登录。…