当前位置: 首页 > news >正文

LeetCode 2 两数相加

题目描述

链接:https://leetcode.cn/problems/add-two-numbers/?envType=featured-list&envId=2ckc81c?envType=featured-list&envId=2ckc81c

难度:中等

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

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

你可以假设除了数字 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
  • 题目数据保证列表表示的数字不含前导零
  • 数字按照逆序排序的意思就是,头节点是个位数,下一节点是十位数,依次类推。如果相加大于等于10,则需要进位,把位数加到后面的和中
  • 两个链表的长度不一定一样

解法

遍历两个链表,然后依次取节点元素相加。如果相加大于等于10,则需要进位,把位数加到后面的和中。

两个链表的长度不一定一样。遍历时,如果短的遍历完了,相加按照0即可。

注意如果链各个链表都加完了,进位还为1,链表还有下一个节点,值为1。

还需要注意的是,在第一次循环时,我们无法往一个空节点的末尾添加节点。这里的技巧是,创建一个哨兵节点(dummy node),当成初始的「空链表」。循环结束后,哨兵节点的下一个节点就是最终要返回的链表头节点。

代码如下:

from typing import Optionalclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# cur_node是当前链表,dummy_node是哨兵节点cur_node = dummy_node = ListNode()# carry用来记录上次两数相加进位的数字carry = 0# 如果两个链表有一个不为空,或者进位的不为0,执行下面的逻辑while l1 or l2 or carry != 0:# 当前的和为链表两个节点数字相加,再加上上一次进位的数字,注意链表长度可能不一样,如果短的那个没有节点了,就取0即可carry = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry# 下一个节点的值,取和对10的余数即可cur_node.next = ListNode(carry % 10)# 更新当前节点为下一个节点cur_node = cur_node.next# 新的进位是除以10的商carry //= 10# 最后遍历参数链表里下一个节点l1 = l1.next if l1 else Nonel2 = l2.next if l2 else None# 哨兵节点的下一个节点即为结果节点return dummy_node.next# 辅助函数:用来创建链表
def build_link(l : Optional[list]):head = current_node = Nonefor ele in l:if current_node:current_node.next = ListNode(ele)current_node = current_node.nextelse:head = current_node = ListNode(ele)return head# 辅助函数:用来打印链表
def print_node(n : Optional[ListNode]):l = []while n:l.append(n.val)n = n.nextprint(l)if __name__ == "__main__":l1 = [9, 9, 9, 9, 9, 9, 9]l2 = [9, 9, 9, 9]link1 = build_link(l1)link2 = build_link(l2)res = Solution().addTwoNumbers(link1, link2)print_node(res)

复杂度

时间复杂度:O(n)
空间复杂度:O(1)

http://www.lryc.cn/news/196406.html

相关文章:

  • springboot项目启动失败,不打印报错详细信息(启动打印日记问题)
  • MyBatis (where、set、foreach)标签
  • flutter开发之安装dart
  • 向量召回:深入评估离线体系,探索优质召回方法
  • 播放器缓存队列bug解决方案
  • React拖拽实践
  • Stable Diffusion绘图,lora选择
  • kube-controller-manager和kube-scheduler不能正常启动
  • Mac OS m1 下安装Gradle5.1
  • JUC并发编程面试题(自用)
  • Redis分布式会话
  • 程序员大厂之鹅厂探秘
  • 【Java 进阶篇】深入理解 JavaScript DOM Node 对象
  • 测试用例基础
  • “Flex弹性布局、轮播图mock遍历数据和首页布局解析与实践“
  • 自动化办公篇之python
  • 华为云云耀云服务器L实例评测|使用sysbench对云耀云服务器mysql的性能测试
  • 【译】快速开始 Compose 跨平台项目
  • 高性能服务器之mysql数据库连接池设计与实现
  • 黑客技术(自学)——网络安全
  • day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口
  • 【SA8295P 源码分析 (一)】83 - SA8295P HQNX + Android 完整源代码下载方法介绍
  • 文献阅读快速法-ChatPDF
  • Jenkins 内存占用
  • 1. vue-sy-admin: 基于vue3+TypeScript的全局过滤器(filters) 封装及示例
  • 操作系统监控:守护您的计算机系统稳定运行的坚实防线
  • PostgreSQL | CTE | 使用with子句的通用表达式
  • A Close Look into the Calibration of Pre-trained Language Models
  • 【控制台】报错:Uncaught ReferenceError: process is not defined
  • Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1)