【编程之路】面试必刷TOP101:链表(11-16,Python实现)

2023-10-30

面试必刷TOP101:链表(11-16,Python实现)

11.两个链表生成相加列表(小试牛刀

step 1:任意一个链表为空,返回另一个链表就行了,因为链表为空相当于 0,0 加任何数为 0,包括另一个加数为 0 的情况。
step 2:相继反转两个待相加的链表,反转过程可以参考 反转链表
step 3:设置返回链表的链表头,设置进位 c a r r y = 0 carry=0 carry=0
step 4:从头开始遍历两个链表,直到两个链表节点都为空且 c a r r y carry carry 也不为 1。每次取出不为空的链表节点值,为空就设置为 0,将两个数字与 c a r r y carry carry 相加,然后查看是否进位,将进位后的结果(对 10 取模)加入新的链表节点,连接在返回链表后面,并继续往后遍历。
step 5:返回前将结果链表再反转回来。
在这里插入图片描述

11.1 反转链表法

class Solution:
    def ReverseList(self, pHead: ListNode) -> ListNode:
        if pHead == None:
            return None
        cur = pHead
        pre = None
        while cur != None:
            temp = cur.next
            cur.next = pre
            pre = cur
            cur = temp
        return pre
    def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:
        if head1 == None:
            return head2
        if head2 == None:
            return head1
        head1 = self.ReverseList(head1)
        head2 = self.ReverseList(head2)
        res = ListNode(-1)
        head = res
        carry = 0
        while head1 != None or head2 != None or carry != 0:
            val1 = 0 if head1 == None else head1.val
            val2 = 0 if head2 == None else head2.val
            temp = val1 + val2 + carry
            carry = int(temp / 10)
            temp = temp % 10
            head.next = ListNode(temp)
            head = head.next
            if head1 != None:
                head1 = head1.next
            if head2 != None:
                head2 = head2.next
        return self.ReverseList(res.next)

时间复杂度: O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),其中 m m m n n n 分别为两个链表的长度,翻转链表三次,复杂度分别是 O ( n ) O(n) O(n) O ( m ) O(m) O(m) O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),相加过程也是遍历较长的链表。
空间复杂度: O ( 1 ) O(1) O(1),常数级指针,没有额外辅助空间,返回的新链表属于必要空间。

12.单链表的排序(小试牛刀

12.1 归并排序法

在这里插入图片描述

class Solution:
    def merge(self, pHead1: ListNode, pHead2: ListNode) -> ListNode:
        if pHead1 == None:
            return pHead2
        if pHead2 == None:
            return pHead1
        head = ListNode(-1)
        cur = head
        while pHead1 != None and pHead2 != None:
            if pHead1.val <= pHead2.val:
                cur.next = pHead1
                pHead1 = pHead1.next
            else:
                cur.next = pHead2
                pHead2 = pHead2.next
            cur = cur.next
        if pHead1 != None:
            cur.next = pHead1
        if pHead2 != None:
            cur.next = pHead2
        return head.next
    def sortInList(self , head: ListNode) -> ListNode:
        if head == None or head.next == None:
            return head
        left = head
        mid = head.next
        right = head.next.next
        while right != None and right.next != None:
            left = left.next
            mid = mid.next
            right = right.next.next
        left.next = None
        return self.merge(self.sortInList(head),self.sortInList(mid))

时间复杂度:O(nlogn),归并排序的复杂度。
空间复杂度:O(logn),递归栈的深度最坏为 logn 层。

12.2 转为数组排序法

class Solution:
    def sortInList(self , head: ListNode) -> ListNode:
        a = []
        p = head
        while p != None:
            a.append(p.val)
            p = p.next
        p = head
        a = sorted(a)
        for i in range(0,len(a)):
            p.val = a[i]
            p = p.next
        return head

时间复杂度:O(nlogn),sort 函数的复杂度
空间复杂度:O(n),存储链表元素值的辅助数组长度 n

13.判断一个链表是否为回文结构(小试牛刀

在这里插入图片描述

13.1 数组复制反转法

class Solution:
    def isPail(self , head: ListNode) -> bool:
        a = []
        while head != None:
            a.append(head.val)
            head = head.next
        b = a.copy()
        b.reverse()
        for i in range(0,len(a)):
            if a[i] != b[i]:
                return False
        return True

时间复杂度:O(n),其中 n 为链表的长度,遍历链表转化数组为 O(n),反转数组为 O(n),后续遍历两个数组为 O(n)。
空间复杂度:O(n),记录链表元素的辅助数组。

13.2 数组复制双指针

class Solution:
    def isPail(self , head: ListNode) -> bool:
        a = []
        while head != None:
            a.append(head.val)
            head = head.next
        left = 0
        right = len(a) - 1
        while left <= right:
            if a[left] != a[right]:
                return False
            left = left + 1
            right = right - 1
        return True

时间复杂度:O(n),其中 n 为链表的长度,遍历链表转化数组为 O(n),双指针遍历半个数组为 O(n)。
空间复杂度:O(n),记录链表元素的辅助数组。

13.3 长度法找中点

class Solution:
    def reverse(self, head: ListNode):
        p = None
        while head != None:
            temp = head.next
            head.next = p
            p = head
            head = temp
        return p
    def isPail(self , head: ListNode) -> bool:
        p = head
        n = 0
        while p != None:
            n = n + 1
            p = p.next
        n = n / 2
        p = head
        while n > 0:
            p = p.next
            n = n - 1
        p = self.reverse(p)
        q = head
        while p != None:
            if p.val != q.val:
                return False
            p = p.next
            q = q.next
        return True

时间复杂度:O(n),其中 n 为链表的长度,遍历链表找到长度为 O(n),后续反转链表为 O(n),然后再遍历两份半个链表。
空间复杂度:O(1),常数级变量,没有额外辅助空间。

13.4 双指针找中点

class Solution:
    def reverse(self, head: ListNode):
        p = None
        while head != None:
            temp = head.next
            head.next = p
            p = head
            head = temp
        return p
    def isPail(self , head: ListNode) -> bool:
        if head == None:
            return True
        p = head
        q = head
        while p != None and p.next != None:
            p = p.next.next
            q = q.next
        q = self.reverse(q)
        p = head
        while q != None:
            if p.val != q.val:
                return False
            p = p.next
            q = q.next
        return True

时间复杂度:O(n),其中 n 为链表的长度,双指针找到中点遍历半个链表,后续反转链表为 O(n),然后再遍历两份半个链表。
空间复杂度:O(1),常数级变量,没有额外辅助空间。

13.5 栈逆序

class Solution:
    def isPail(self , head: ListNode) -> bool:
        p = head
        a = []
        while p:
            a.append(p.val)
            p = p.next
        p = head
        while len(a) != 0:
            if p.val != a.pop():
                return False
            p = p.next
        return True

时间复杂度:O(n),其中 n 为链表的长度,遍历链表入栈为 O(n),后续再次遍历链表和栈。
空间复杂度:O(n),记录链表元素的辅助栈。

14.链表的奇偶重排(小试牛刀

在这里插入图片描述

14.1 奇偶重排

class Solution:
    def oddEvenList(self , head: ListNode) -> ListNode:
        if head == None:
            return head
        p = head
        q = head.next
        res = q
        while q != None and q.next != None:
            p.next = q.next
            p = p.next
            q.next = q.next.next
            q = q.next
        p.next = res
        return head

时间复杂度:O(n),遍历一次链表。
空间复杂度:O(1),常数个指针,无额外辅助空间。

15.删除有序链表中重复的结构(一)(小试牛刀

在这里插入图片描述

15.1 遍历删除

class Solution:
    def deleteDuplicates(self , head: ListNode) -> ListNode:
        if head == None:
            return None
        p = head
        while p != None and p.next != None:
            if p.val == p.next.val:
                p.next = p.next.next
            else:
                p = p.next
        return head

时间复杂度:O(n),其中 n 为链表长度,遍历一次链表。
空间复杂度:O(1),没有使用额外的辅助空间。

16.删除有序链表中重复的结构(二)(小试牛刀

在这里插入图片描述

16.1 直接比较删除法

class Solution:
    def deleteDuplicates(self , head: ListNode) -> ListNode:
        if head == None:
            return None
        res = ListNode(-1)
        res.next = head
        p = res
        while p.next != None and p.next.next != None:
            if p.next.val == p.next.next.val:
                temp = p.next.val
                while p.next != None and p.next.val == temp:
                    p.next = p.next.next
            else:
                p = p.next
        return res.next

时间复杂度:O(n),其中 n 为链表结点数,只有一次遍历。
空间复杂度:O(1),只开辟了临时指针,没有额外空间。

16.2 哈希表

class Solution:
    def deleteDuplicates(self , head: ListNode) -> ListNode:
        if head == None:
            return None
        p = head
        a = dict()
        while p != None:
            if p.val in a:
                a[p.val] += 1
            else:
                a[p.val] = 1
            p = p.next
        res = ListNode(-1)
        res.next = head
        p = res
        while p.next != None:
            if a[p.next.val] != 1:
                p.next = p.next.next
            else:
                p = p.next
        return res.next

时间复杂度:O(n),其中 n 为链表结点数,一共两次遍历,每次计数、每次查询都是 O(1)
空间复杂度:O(n),最坏情况下 n 个结点都不相同,哈希表长度为 n

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编程之路】面试必刷TOP101:链表(11-16,Python实现) 的相关文章

  • 如何在Python的SciPy中更改稀疏矩阵中的元素?

    我构建了一个小代码 我想用它来解决涉及大型稀疏矩阵的特征值问题 它工作正常 我现在要做的就是将稀疏矩阵中的一些元素设置为零 即最顶行中的元素 对应于实现边界条件 我可以调整下面的列向量 C0 C1 和 C2 来实现这一点 不过我想知道是否有
  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • 使用 pygame 显示 unicode 符号

    我检查了其他答案 但不明白为什么我的代码错误地显示 This is what I currently see https i stack imgur com 8tNIK png 这是关于文本渲染的相关代码 font pygame font
  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • git部署出现的问题

    git部署出现的问题 error remote origin already exists remote rejected master master hook declined 一 出错信息 fatal remote origin alr
  • spring boot 配置log4j2

    刚入职新公司 接到的第一个需求就是把项目的log4j 1 x 升级到2 x 之前没有做过日志配置 都是直接拿来用的 这是第一次自己配置日志文件 所以记录下相关知识点 1 排除1 0的jar包 首先排查项目中log的版本 把1 0相关的版本都
  • AI-day02-2(Python小白逆袭大神)

    安装paddlehub pip install paddlehub 1 6 0 i https pypi tuna tsinghua edu cn simple Looking in indexes https pypi tuna tsin
  • AndroidStudio如何使用@hide api

    前提 你的应用必须是System App 在project的build gradle里面添加 gradle projectsEvaluated 所有的 project 都配置完成后的回调 此时 所有的project都已经配置完毕 准备开始生
  • 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇 DRM驱动程序开发 VKMS 文章里 我们学习了如何编写一个最简单的 KMS 驱动 而本篇 我将以叙述的形式为大家讲解 DRM GEM 的相关概念 代码留到下一篇进行讲解 我知道 大多数的 DRM 初学人员 在刚接触到 GE
  • 怎么编写接口测试用例

    怎么编写接口测试用例 接口测试用例如何编写 看到许多这样的问题 大家都知道编写接口测试用例是接口测试的重要组成部分 它决定了测试的质量和可靠性 因此 程序员必须编写高质量的接口测试用例 以确保接口在生产环境中能够正常运行 编写接口测试用例的
  • C语言基础入门48篇_14_逻辑运算符(逻辑与(&&)、逻辑或(

    C语言中的逻辑运算符有 及 他们分别被称为逻辑与 逻辑或 逻辑非 前两者是二元运算符 逻辑非是一元运算符 1 逻辑与运算符 逻辑与运算符的基本语法是 表达式1 表达式2 其求值的结果规则是 1 当两个表达式均为非0时 求值结果为1 2 其他
  • vue2在css中使用js变量

    本篇将实现vue2在css中使用js变量 下图是el tab组件 由上面的tab头和下面的内容区构成 当内容区过长的时候 外层固定高度的盒子会出现滚动条 设置了overflow auto tab头部会向上滚动而消失 滚动前 滚动后 现在的需
  • pyqt5安装

    一定要先pip install sip 再pip install pyqt5 不然可能会安装失败 然后测试一下是否成功 输入 import sys from PyQt5 QtWidgets import QWidget QApplicati
  • Redis 发布 订阅

    1 简介 Redis 发布订阅 pub sub 是一种消息通信模式 发送者 pub 发送消息 订阅者 sub 接收消息 Redis 客户端可以订阅任意数量的频道 客户端订阅频道 当给频道发布消息后 消息就会发送给订阅的客户端 2 实现 A
  • Linux下gcc编译器的编译过程

    一 什么是GCC GCC是以GPL许可证所发行的自由软件 也是GNU计划的关键部分 GCC的初衷是为GNU操作系统专门编写一款编译器 现已被大多数类Unix操作系统 如Linux BSD MacOS X等 采纳为标准的编译器 甚至在微软的W
  • 10吨地埋式农村生活废水处理设备厂家电话

    10吨地埋式农村生活废水处理设备厂家电话 工艺流程 厌氧生化处理 好氧生物接触氧化 二沉沉淀 二氧化氯接触消毒 达标排放 工艺流程 采用生物膜法 缺氧 好氧 A 0 处理工艺 A O即缺氧好氧生物接触氧化法是一种成熟的生物处理工艺 具有容积
  • 阻止 mousemove 或 touchmove 与 click 事件同时触发

    最近做了自己的开源项目 Msw Tools 参考了 VConsole 工具中按钮的拖拽功能 计划给 MSW 按钮也增加类似的拖拽效果 并兼容PC端和手机端 但是遇到一个问题 一个按钮绑定了多个事件 怎样才能阻止 mousemove 或 to
  • forward与redirect的区别

    1 二者的请求方式不同 redirect是通过客户端发起的请求 forward是通过服务器端发起的请求 2 在浏览器中二者的url表现不同 redirect在浏览器中显示的是被请求的URL forward在浏览器中不显示被请求的URL 3
  • PT100 or PT1000 温度计算公式(有代码)生成数组

    关于PT100测温可以看上一篇文章 关于用STM32ADC TP100测温电路的分析学习 这里要在程序中使用查表的方法来计算温度 所以就需要一个温度和阻值的对照表格 在网上搜了一下没有可以直接复制的 干脆自己写一个以后万一用得到 直接插代码
  • 【安全狗】linux免费服务器防护软件安全狗详细安装教程

    在费用有限的基础上 复杂密码 云服务器基础防护 常见端口替换 安全软件 可以防护绝大多数攻击 第一步 下载服务器安全狗Linux版 下文以64位版本为例 官方提供了两个下载方式 本文采用的是 方式2 wget安装 方法1 在安全狗官网直接下
  • 以下是HTML网页登录页面,这是一个简单的登录页面,需要的可以建立超链接,不会链接的小伙伴,我们可以利用< a href=“ “>标签建立超链接,在双引号里输入要连接的文件。制作不易,留个关注后续更新

    p p h1 width 100 align center p style color red 4K超清壁纸网 p h1
  • 计算机网络第四章——网络层1(仅记录我所认为重要的知识点)

    计算机网络第四章 网络层1 网络层功能概述 主要功能 网络层向传输层提供服务 服务的要求 OSI和TCP IP体系结构对比 网络层设计思想 1 让网络负责可靠交付 面向连接 虚电路服务 2 不可靠交付 无连接 数据报服务 网络提供数据报服务
  • 媒体服务器与视频服务器有什么区别

    媒体服务器与视频服务器有什么区别 流媒体服务器用在远程教育 视频点播 网络电台 网络视频等方面 直播过程中就需要使用流媒体服务器 一个完整的直播过程 包括采集 处理 编码 封包 推流 传输 转码 分发 解码 播放等过程 流媒体服务器主要负责
  • 【编程之路】面试必刷TOP101:链表(11-16,Python实现)

    面试必刷TOP101 链表 11 16 Python实现 11 两个链表生成相加列表 小试牛刀 step 1 任意一个链表为空 返回另一个链表就行了 因为链表为空相当于 0 0 加任何数为 0 包括另一个加数为 0 的情况 step 2 相