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

news2024/11/24 5:21:02

文章目录

  • 问题描述
    • 示例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 l2
        if not l2:
            return l1
        dummy = ListNode(0)

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

curr = dummy

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

carry = 0

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

while l1 or l2:
    x = l1.val if l1 else 0
    y = l2.val if l2 else 0
    sum = x + y + carry
    carry = sum // 10
    curr.next = ListNode(sum % 10)
    curr = curr.next
    if l1:
        l1 = l1.next
    if 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为空链表,返回l2
            return l2
        if not l2:  # 如果l2为空链表,返回l1
            return l1
        dummy = ListNode(0)  # 创建一个值为0的哑结点,用于表示结果链表的头节点

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

        carry = 0  # 初始化进位值为0

        while l1 or l2:  # 开始遍历两个链表,循环条件为两个链表中至少有一个未遍历完
            x = l1.val if l1 else 0  # 获取当前节点l1的值,如果l1为空,则视为0
            y = l2.val if l2 else 0  # 获取当前节点l2的值,如果l2为空,则视为0
            sum = x + y + carry  # 计算当前位置的两个节点值以及进位的和
            carry = sum // 10  # 更新进位值,如果和大于等于10,则进位为1;否则进位为0
            curr.next = ListNode(sum % 10)  # 创建新的节点,并将其链接到当前节点的下一个
            curr = curr.next  # 将当前节点指针后移一位,指向新创建的节点
            if l1:  # 如果l1还未遍历完,将当前节点指针后移一位
                l1 = l1.next
            if l2:  # 如果l2还未遍历完,将当前节点指针后移一位
                l2 = l2.next

        if 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.coloradmin.cn/o/745777.html

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

相关文章

RabbitMQ常用工作模式+整合springboot

目录 1.MQ的相关概念 1.1 什么是MQ消息中间件 1.2 为什么使用MQ (1) 应用解耦 (2) 异步提速 (3)削峰填谷 1.3 使用MQ的劣势 1.4 常见的MQ组件​​​​​​​ 2. RabbitMQ的概述 2.1 RabbitMQ的概念 2.2 RabbitMQ的原理 2.3 安装RabbitMQ 3. RabbitMQ 的工作模式…

Swift与OC的混编

一些场面话 在一位前辈的博客里看到了关于iOS开发的各种语言的混编&#xff0c;浅浅学习一下怎么使用。不得不说语言混编的开发者是真的&#x1f42e;&#x1f37a; Swift中用OC混编 新建一个Swift文件 创建一个OC的类 选择language为OC 继续往下走&#xff0c;会跳出这个界…

学无止境·MySQL⑤(存储函数、存储过程)

存储函数和存储过程试题 试题一1、创建一个可以统计表格内记录条数的存储函数 &#xff0c;函数名为count_sch()2、创建一个存储过程avg_sai&#xff0c;有3个参数&#xff0c;分别是deptno&#xff0c;job&#xff0c;接收平均工资&#xff0c;功能查询emp表dept为30&#xff…

C/C++用socket实现简单的TCP文件传输

C/C:用socket实现简单的TCP文件传输 网络中进程之间如何进行通信socket是什么socket的基本操作socket()函数bind()函数listen()、connect()函数accept()函数recv()/send()函数close()函数 TCP的“三次握手”“三次握手”的作用 TCP的“四次挥手”四次挥手的一些注意事项 代码实…

【附3.7安装包】python安装包下载及安装(超详细)

python3.7链接&#xff1a;https://pan.baidu.com/s/1Ett3XBMjWhkVOxkOU8NRqw?pwdqz3l 提取码&#xff1a;qz3l 今日资源&#xff1a;Python 适用系统&#xff1a;WINDOWS ​ Python 3.7.0 软件介绍&#xff1a; Python是一款通用型的计算机程序设计语言&#xff0c;Pytho…

【Leetcode】19. 删除链表的倒数第N个节点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&…

有没有线上兼职的副业,在家可以做什么赚钱

线上兼职副业啊&#xff0c;确实是一个不错的副业选择&#xff01;不过&#xff0c;我得提醒你&#xff0c;如果想要那种点一下鼠标就会下金币的神仙项目&#xff0c;这样的期待的话&#xff0c;那我只能告诉你&#xff0c;你可能走错地方了&#xff0c;在这帮不了你。 在线上赚…

LeetCode[470]用Rand7()实现Rand10()

难度&#xff1a;Medium 题目&#xff1a; 给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数&#xff0c;试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。 你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。 每个测试用例将有一个内部…

Python案例分析|基于模块的库存管理系统

本案例是通过一个多模块的库存管理系统案例&#xff0c;帮助大家深入了解基于模块的Python应用程序的开发流程。 01、库存管理系统API设计 本文实现一个简单的基于模块的库存管理系统。系统采用JSON文件来保存数据。产品信息设计为字典&#xff0c;键为sku_id&#xff08;产品…

软件工程——第13章软件项目管理知识点整理(完结)

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.管理的定义&#xff1f; 2.软件项目管理地位&#xff1f;&#xff08;重要性&#xff09; 3.软件项目管理过程从一组项目计划活动开始&#xff0c…

怎么制作查询成绩的网页?这个不用代码的方法你用过没?

作为一名老师&#xff0c;与家长沟通交流是日常工作中重要的一部分。特别是每次考完试后&#xff0c;家长都急切地想了解孩子的成绩&#xff0c;以便能及时了解孩子的学习情况并给予适当的支持和指导。然而&#xff0c;为了保护学生的隐私&#xff0c;大部分学校不公开张榜学生…

字符设备驱动led灯实验

应用程序代码 #include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>int main (int argc, const char *argv[]) {char buf[128] &quo…

马上就要到2023年秋招的黄金时期了,计算机专业面试究竟需要注意些什么?

说说自己&#xff0c;不算很突出。本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全实验室。 所以我还是比较有话语权的吧。 话不多说直接进入主题。 1.理论知识准备&#xff1a;复习计算…

驱动 day9 作业

要求&#xff1a; 现象 按下key1 led1灯的状态取反&#xff0c;number的值取反&#xff0c;然后应用程序打印从内核读到的number的值 应用程序test.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #incl…

Bash 有效电话号码

193 有效电话号码 给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&…

三维重建以及神经渲染中的学习(三)

三维重建以及神经渲染中的学习 公众号AI知识物语 本文内容为参加过去一次暑期课程学习时的笔记&#xff0c;浅浅记录下。 三维图形可控生成&#xff1a; 1&#xff1a;学习一个图形生成模型 2&#xff1a;具有可控三维变量&#xff1a;1物体形状&#xff1b;2物体位置&…

ScannerException: while scanning for the next token found character ‘@‘ 问题解决

问题描述 后端项目启动的时候报ScannerException: while scanning for the next token found character ‘‘ 异常&#xff0c;自己有些疑问&#xff0c;项目前一会都还可以&#xff0c;到报错的过程中&#xff0c;项目都没有动过。 解决办法 重新刷新项目就解决了。

RxSwift 使用方式

背景 最近项目业务&#xff0c;所有模块已经支持Swift混编开发&#xff0c;正在逐步使用Swift 方式进行开发新业务&#xff0c;以及逐步替换老业务方式进行发展&#xff0c;所以使用一些较为成熟的Swift 的三方库&#xff0c;成为必要性&#xff0c;经过调研发现RxSwift 在使用…

HarmonyOS/OpenHarmony应用开发-程序包多HAP机制(上)

一、多HAP机制设计目标 方便开发者模块化的管理应用&#xff0c;好的应用一般都是模块化管理&#xff0c;模块之间属于松耦合关系。多HAP方便了开发者将业务划分成多个模块&#xff0c;每个模块放到独立的HAP中。例如支付类应用&#xff0c;有统一的主界面&#xff0c;主界面管…

命令注入(Command Injection)安全漏洞(SQL注入、LDAP注入、OS命令注入、XPath注入、JavaScript注入)

文章目录 命令注入&#xff08;Command Injection&#xff09;发生场景示例防范手段其他类型命令注入漏洞1. SQL注入&#xff08;SQL Injection&#xff09;2. LDAP注入&#xff08;LDAP Injection&#xff09;3. OS命令注入&#xff08;OS Command Injection&#xff09;4. XP…