【力扣算法07】之 2.两数相加 python

文章目录

  • 问题描述
    • 示例1
    • 示例2
    • 示例 3
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
    • 详细分析
  • 完结

问题描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

思路分析

在这里插入图片描述

  1. 首先,检查特殊情况。如果其中一个链表为空,直接返回另一个链表。这是为了处理其中一个链表为空的边界情况。

  2. 然后,创建一个哑结点(dummy)作为结果链表的头节点,并创建一个当前节点指针(curr)用于逐个链接新的节点。

  3. 接下来,需要考虑进位问题。创建一个变量carry,用于记录当前的进位值,初始值为0。

  4. 然后,开始遍历两个链表,同时处理进位。遍历过程中,我们需要同时访问两个链表的当前节点,并将其值加上进位值,得到一个新的节点值。如果某个链表已经遍历完了,我们可以将其缺失的位数视为0。

  5. 在每一位数字相加后,需要更新carry变量。当两个数的和超过9时,carry等于1,否则carry等于0。我们可以使用除法运算符和取模运算符进行计算。

  6. 将新的节点插入结果链表中,并将当前节点指针后移一位。注意,我们需要使用"curr.next"来链接新的节点,并将当前节点指针更新为新的节点。

  7. 继续遍历两个链表,直到其中一个链表遍历完或者两个链表都遍历完为止。这样可以确保将两个链表的所有位数都相加到结果链表中。

  8. 检查是否还有进位需要处理。如果carry大于0,说明还有进位,需要将其作为新的节点添加到结果链表的末尾。

  9. 最后,返回结果链表的头节点(dummy.next),即可得到表示和的链表。

  10. 通过遍历两个逆序链表,逐位相加,并处理进位问题,实现了将两个非负整数相加的功能。

代码分析

问题描述

class Solution(object):def addTwoNumbers(self, l1, l2):if not l1:return l2if not l2:return l1dummy = ListNode(0)

这行代码定义了一个名为dummy的哑结点,用于表示结果链表的头节点。

curr = dummy

这行代码将curr指针指向哑结点,作为当前节点的指针。

carry = 0

这行代码初始化进位值为0。

while l1 or l2:x = l1.val if l1 else 0y = l2.val if l2 else 0sum = x + y + carrycarry = sum // 10curr.next = ListNode(sum % 10)curr = curr.nextif l1:l1 = l1.nextif l2:l2 = l2.next

这段代码使用了循环来遍历两个链表并进行相加。在每一次循环中,根据当前节点是否为空,获取当前节点的值,并处理链表已经遍历完的情况。接着,计算当前位置的两个节点值以及进位的和,并更新进位值。然后,创建新的节点,并将其链接到当前节点的下一个,将当前节点指针后移一位,指向新创建的节点。最后,如果链表还未遍历完,将当前节点指针后移一位。

if carry > 0:curr.next = ListNode(carry)

这行代码处理最后的进位,如果最后还有进位,创建新的节点并将其链接到结果链表的末尾。

return dummy.next

这行代码返回结果链表的头节点(dummy.next)。

完整代码

class Solution(object):  # 定义一个Solution类,继承自object基类def addTwoNumbers(self, l1, l2):  # 定义一个addTwoNumbers方法,接受l1和l2两个参数if not l1:  # 如果l1为空链表,返回l2return l2if not l2:  # 如果l2为空链表,返回l1return l1dummy = ListNode(0)  # 创建一个值为0的哑结点,用于表示结果链表的头节点curr = dummy  # 将curr指针指向哑结点,用于逐个链接新的节点carry = 0  # 初始化进位值为0while l1 or l2:  # 开始遍历两个链表,循环条件为两个链表中至少有一个未遍历完x = l1.val if l1 else 0  # 获取当前节点l1的值,如果l1为空,则视为0y = l2.val if l2 else 0  # 获取当前节点l2的值,如果l2为空,则视为0sum = x + y + carry  # 计算当前位置的两个节点值以及进位的和carry = sum // 10  # 更新进位值,如果和大于等于10,则进位为1;否则进位为0curr.next = ListNode(sum % 10)  # 创建新的节点,并将其链接到当前节点的下一个curr = curr.next  # 将当前节点指针后移一位,指向新创建的节点if l1:  # 如果l1还未遍历完,将当前节点指针后移一位l1 = l1.nextif l2:  # 如果l2还未遍历完,将当前节点指针后移一位l2 = l2.nextif carry > 0:  # 如果最后还有进位,创建新的节点并将其链接到结果链表的末尾curr.next = ListNode(carry)return dummy.next  # 返回结果链表的头节点(dummy.next)

详细分析

  1. class Solution(object)::定义了一个名为Solution的类,继承自object

  2. def addTwoNumbers(self, l1, l2)::定义了一个名为addTwoNumbers的方法,它接受self(表示当前对象)以及两个参数l1l2(两个链表)。

  3. """"""之间的内容是方法的文档字符串,用于描述方法的功能和参数。

  4. if not l1: return l2if not l2: return l1:检查特殊情况。如果其中一个链表为空,直接返回另一个链表作为结果。

  5. dummy = ListNode(0):创建一个值为0的哑结点,用于表示结果链表的头节点。

  6. curr = dummy:将curr指针指向哑结点,用于逐个链接新的节点。

  7. carry = 0:初始化进位值为0。

  8. while l1 or l2::开始遍历两个链表,循环条件为两个链表中至少有一个未遍历完。

  9. x = l1.val if l1 else 0y = l2.val if l2 else 0:获取当前节点的值,并处理链表已经遍历完的情况。如果链表已经遍历完,将当前节点的值视为0。

  10. sum = x + y + carry:计算当前位置的两个节点值以及进位的和。

  11. carry = sum // 10:更新进位值,如果和大于等于10,则进位为1;否则进位为0。

  12. curr.next = ListNode(sum % 10):创建新的节点,并将其链接到当前节点的下一个。

  13. curr = curr.next:将当前节点指针后移一位,指向新创建的节点。

  14. if l1: l1 = l1.nextif l2: l2 = l2.next:如果链表还未遍历完,将当前节点指针后移一位。

  15. if carry > 0: curr.next = ListNode(carry):如果最后还有进位,创建新的节点并将其链接到结果链表的末尾。

  16. return dummy.next:返回结果链表的头节点(dummy.next)。

完结

在这里插入图片描述

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

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

相关文章

机器学习 day25(softmax在神经网络模型上的应用,提高数据精度的方法)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

第4集丨JavaScript 使用原型(prototype)实现继承——最佳实战2

目录 一、临时构造器方式1.1 代码实现1.2 代码分析 二. 增加uber属性&#xff0c;用于子对象访问父对象2.1 实现分析2.2 代码实现 三. 将继承封装成extend()函数3.1 代码实现3.1.1 临时构造器实现extend()3.1.2 原型复制实现extend2() 3.2 代码测试3.2.1 测试extend()函数3.2.1…

【实战项目】c++实现基于reactor的高并发服务器

基于Reactor的高并发服务器&#xff0c;分为反应堆模型&#xff0c;多线程&#xff0c;I/O模型&#xff0c;服务器&#xff0c;Http请求和响应五部分 全局 反应堆模型 Channel 描述了文件描述符以及读写事件&#xff0c;以及对应的读写销毁回调函数&#xff0c;对应存储arg读…

优化SQL查询实现高效数据检索(二)

大家好&#xff0c;本文将接着上文&#xff0c;继续介绍SQL查询优化的重要性以及如何优化SQL查询以实现更快的数据检索。 适当使用通配符 适当使用通配符对于优化SQL查询尤为重要&#xff0c;特别是在匹配字符串和模式方面。通配符是用于SQL查询中查找特定模式的特殊字符&…

K8s(kubernetes)集群搭建及dashboard安装、基础应用部署

基础介绍 概念 本质是一组服务器集群&#xff0c;在集群每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。实现资源管理的自动化。 功能 自我修复弹性伸缩服务发现负载均衡版本回退存储编排 组件 控制节点(master)-控制平面 APIserver&#xff1a;资源操作…

Linux ❀ Openssh 8.9p1源码升级教程

文章目录 升级操作注意事项&#xff1a;1. 安装依赖2. 执行升级2.1 上传压缩包并保存配置2.2 开始升级 升级操作注意事项&#xff1a; 编译过程需要依赖&#xff0c;必须安装完成!!!SSH服务升级过程可能会导致无法远程连接服务器!!!若必须远程登录必须确认telnet服务可用!!!升…

第四十六章Java包(package)

在编写 Java 程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也是一件很麻烦的事&#xff0c;尤其是一些同名问题的发生。有时&#xff0c;开发人员还可能需要将处理同一方面的问题的类放在同一个目录下&a…

Android - AIDL

一、概念 二、使用 2.1 Server 端 2.1.1 创建 .aidl 文件 Module右键→New→AIDL→AIDL File&#xff08;如果不可选&#xff0c;在build.gradle的buildFeatures节点添加aidl true&#xff09;。 在创建的接口中定义抽象方法。 interface IDemoAidlInterface {//自己的业…

【STM32MP135】修复EMMC模式启动时,uboot启动识别为usb0设备问题

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk.dts 文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/configs/stm32mp13_defconfig

基于霍夫变换的航迹起始算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 一、设计内容 利用Hough变换处理量测得到的含杂波的二维坐标&#xff0c;解决多目标航迹起始问题。使用Matlab进行仿真&#x…

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

k8s+springboot+CronJob 定时任务部署

kubernetesspringbootCronJob 定时任务配置如下代码&#xff1a; cronjob.yaml k8s 文件 apiVersion: batch/v1 kind: CronJob metadata:name: k8s-springboot-demonamespace: rz-dt spec:failedJobsHistoryLimit: 3 #执行失败job任务保留数量successfulJobsHistoryLimit: 5 …