linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

02:两数相加

  • 题目描述
    • 示例
    • 提示
  • 导入和定义
    • 导入 Optional和定义 NodeList
  • 数据结构说明
    • Optional 类型
    • ListNode 类
  • 解题思路
  • 代码实现
  • 复杂度分析
  • 代码说明
    • to_str()函数解释
    • 函数实现细节
    • 工作流程
    • 示例说明

题目描述

题目 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

YrzPix

提示

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 ≤ Node.val ≤ 9
  • 题目数据保证列表表示的数字不含前导零

导入和定义

导入 Optional和定义 NodeList

from typing import Optional

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

数据结构说明

Optional 类型

Optional 是 Python 类型提示中的一个泛型类型,用于表示一个值可能为 None。在本题中,它用于表示链表节点可能不存在的情况。

# Optional[ListNode] 表示参数可能是 ListNode 类型,也可能是 None
def some_function(node: Optional[ListNode]) -> Optional[ListNode]:
    pass

ListNode 类

ListNode 是一个自定义的链表节点类,用于构建单向链表数据结构:

  • val: 存储节点的值(0-9)
  • next: 指向下一个节点的指针

解题思路

  1. 同时遍历两个链表,对应位置数字相加
  2. 处理进位情况
  3. 注意链表长度不同的情况
  4. 最后的进位需要新建节点

代码实现


from typing import Optional

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], 
                      l2: Optional[ListNode]) -> Optional[ListNode]:
        def to_str(node):
            """
            将一个链表转换成字符串
            """
            num_str = ''
            while node:
                num_str = str(node.val) + num_str
                node = node.next
            return num_str
        
        l1str = to_str(l1)
        l2str = to_str(l2)

        result_sum = int(l1str) + int(l2str)
        prev_node = None

        for digit in str(result_sum):
            node = ListNode(int(digit), prev_node)
            prev_node = node

        return prev_node if prev_node else ListNode(0)

l1 = ListNode(2, ListNode(4, ListNode(3)))
l2 = ListNode(5, ListNode(6, ListNode(4)))
res = Solution.addTwoNumbers(Solution,l1,l2)

def print_list(node):
    while node:
        print(node.val, end=" ")
        node = node.next
    print()
    
print_list(res)

复杂度分析

  • 时间复杂度:O(max(N,M)),其中 N 和 M 分别为两个链表的长度
  • 空间复杂度:O(max(N,M)),需要存储新链表

代码说明

to_str()函数解释

to_str 函数的目的是将一个链表转换成字符串。 在链表中,每个节点包含一个数字和一个指向下一个节点的指针(或链接)。 这种数据结构不像数组那样可以直接通过索引访问每个元素,而是需要从头节点开始,通过节点之间的链接逐个遍历。

假设有一个链表,代表数字 807,但是它的表示形式是 7 -> 0 -> 8(头节点是 7,它是数字的最低位)。

函数实现细节

def to_str(node):
    num_str = ''
    while node:
        num_str = str(node.val) + num_str
        node = node.next
    return num_str

工作流程

  1. 初始化一个空字符串 num_str:这将用来构建链表代表的数字的字符串表示。

  2. 遍历链表:使用 while node: 循环遍历链表。在每次迭代中,node 是当前的链表节点。

  3. 构建字符串:在每次迭代中,我们取出当前节点的值 node.val(一个数字),将其转换为字符串,然后将其添加到 num_str 的前面。这是因为我们是从链表的头部开始遍历的,头部是数字的最低位。

  4. 移动到下一个节点:通过 node = node.next 移动到链表的下一个节点。

  5. 返回结果字符串:一旦遍历完整个链表,num_str 就包含了链表表示的完整数字的字符串形式。这时函数返回 num_str。

示例说明

对于链表 7 -> 0 -> 8:

  1. 初始: num_str = ""
  2. 第一次迭代: num_str = "7"
  3. 第二次迭代: num_str = "07"
  4. 第三次迭代: num_str = "807"

最终返回字符串 "807",实现了链表到数字的正确转换。

最近更新时间:
Next
09:回文数