《剑指offer》刷题(1)链表篇

news2024/11/17 3:28:47

class ListNode:

     def __init__(self, x):

         self.val = x

         self.next = None

class Solution:

    def printListFromTailToHead(self , listNode: ListNode) -> List[int]:

        #用栈记录遍历的结果,然后返回出栈结果

        if listNode is None:

            return []

        stack = []

        p = listNode

        while p:

            stack.append(p.val)

            p = p.next

        return stack[::-1]

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def ReverseList(self , head: ListNode) -> ListNode:

        #使用递归

        #链表第一步,判断链表是否为空

        if head is None or head.next is None:

            return head

        #想不通就画一个链表只有两个节点,然后连接

        last = self.ReverseList(head.next)

        head.next.next = head

        head.next = None

        return last

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def Merge(self , pHead1: ListNode, pHead2: ListNode) -> ListNode:

        #新设置一个链表,分别用两个指针指向原来的链表,对比大小,将小的节点接到新链表后

        #判断两个链表是否为空

        if pHead1 is None:

            return pHead2

        if pHead2 is None:

            return pHead1

        #设置新链表的头结点

        dummp = ListNode(-1)

        p = dummp

        p1 = pHead1

        p2 = pHead2

        #两个链表的指针都必须存在

        while p1 and p2:

            #比较大小

            if p1.val > p2.val:

                p.next = p2

                p2 = p2.next

            else:

                p.next = p1

                p1 = p1.next

            p = p.next

        #出循环后,可能有一个指针不是空

        if p1:

            p.next = p1

        if p2:

            p.next = p2

        return dummp.next

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def FindFirstCommonNode(self , pHead1 , pHead2 ):

        #分别找两个指针指向两个链表,如果指针1为空,就指向链表2,指针2为空就指向链表1,当两个指针相同时(可能都是空或者相遇了)跳出循环。(两个指针都走了链表1+链表2的长度)

        #判断链表是否为空

        if pHead1 is None:

            return pHead1

        if pHead2 is None:

            return pHead2

        p1 = pHead1

        p2 = pHead2

        while p1 != p2:

            if p1 is None:

                p1 = pHead2

            else:

                p1 = p1.next

            if p2 is None:

                p2 = pHead1

            else:

                p2 = p2.next

        return p1

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def EntryNodeOfLoop(self, pHead):

        #使用快慢指针,先让快慢指针相遇,确定有环,然后将快指针指回头结点,和慢指针一起重新走一遍,步长为1,相遇节点就是环入口。

        #判断链表是否为空

        if pHead is None:

            return None

        fast = pHead

        slow = pHead

        while fast and fast.next:

            fast = fast.next.next

            slow = slow.next

            if fast == slow:

                break

        if fast is None or fast.next is None: #没有环而退出了循环

            return None

        else:

            fast = pHead

            while fast != slow:

                fast = fast.next

                slow = slow.next

        return fast

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def FindKthToTail(self , pHead: ListNode, k: int) :

          #使用快慢指针,让快指针先走k步

         if pHead is None:

            return pHead

        fast = pHead

        slow = pHead

        for _ in range(k): #走k步

            if not fast: #如果中间出现了空,就返回None,否则继续走

                return None

            fast = fast.next

        else:

            while fast:

                slow = slow.next

                fast = fast.next

        return slow

class RandomListNode:

    def __init__(self, x):

        self.label = x

        self.next = None

        self.random = None

class Solution:

    def Clone(self, pHead):

        #使用hash表来存储新链表与旧链表的节点,key:旧链表节点,value:新链表节点

        #两次循环,第一次遍历旧链表,复制next节点,同时保存hash。第二次遍历hash,给新链表指定random指针

        #先判断链表是否为空

        if pHead is None:

            return pHead

        #设置新链表的头结点

        dummp = RandomListNode(-1)

        p = dummp

        cur = pHead

        hash_dict = dict()

        while cur:

            clone = RandomListNode(cur.label) #创建新节点

            p.next = clone #新链表指向新节点

            hash_dict[cur] = clone #hash表保存旧节点和新节点

            cur = cur.next #移动旧链表指针

            p = p.next #移动新链表指针

        for (key,value) in hash_dict.items(): #遍历hash表

            if key.random is None:

                value.random = None

            else:

                value.random = hash_dict[key.random] #key.radom是旧链表中的值,在hash表中可以拿到新链表的对应值。

        return dummp.next

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def deleteDuplication(self , pHead: ListNode):

        #给链表加头结点,方便删除第一个元素,两两比对链表,如果相等,就循环删除

         #判断链表是否为空

        if pHead is None or pHead.next is None:

            return pHead

        #设置头结点

        dummp = ListNode(-1)

        p = dummp

        p.next = pHead

        while p.next and p.next.next: #两两比较

            if p.next.val == p.next.next.val:

                temp = p.next.val #先保存当前等值

                while p.next and p.next.val == temp: #循环删除p.next

                    p.next = p.next.next

            else:

                p = p.next #移动p指针

        return dummp.next

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

class Solution:

    def deleteNode(self , head: ListNode, val: int) -> ListNode:

        #先判断表是否为空

        if head is None:

            return head

        #设立头结点,可能要删第一个节点

        dummp = ListNode(-1)

        p = dummp

        p.next = head

        while p.next:

            if p.next.val == val: #删除p.next

                p.next = p.next.next

            else:

                p = p.next

        return dummp.next

 

 

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

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

相关文章

8.2Thread类的常见属性

1. 2.前台线程和后台线程 前台线程:影响进程结束(如果前台线程没有执行完,进程不结束). 后台线程(守护线程):不影响线程结束. 创建线程默认是前台线程. 修改成后台线程:thread.setDaetrue);

33.利用abs 解决绝对值问题(matlab程序 )

1.简述 abs函数的功能是绝对值和复数的模 语法 Y abs(X) 说明 Y abs(X) 返回数组 X 中每个元素的绝对值。如果 X 是复数,则 abs(X) 返回复数的模。 示例 标量的绝对值 y abs(-5) y 5 向量的绝对值 创建实值的数值向量。 x [1.3 -3.56 8.23 -5 -0.01…

ARP断网攻击及防御

ARP断网攻击及防御 攻击防御 攻击 PC1的IP地址 10.9.136.222 PC2的IP地址 10.9.136.55在局域网里通信 需要有IP地址和MAC地址 两台电脑PC1和PC2要想相互通信,PC1在连接PC2的时候,PC1会先查看自己的ARP缓存表(命令:arp -a &#xf…

利用鸿鹄可观测性监控Istio Ingress网关

一、需求描述 在上一篇《利用Vector和鸿鹄搭建微服务应用的可观测性平台》中,阐述了微服务的基本概念、优点及如何利用鸿鹄来处理分布式应用的日志。本文将进一步讨论微服务架构面临的问题、服务网格及鸿鹄处理Istio Gateway的独特优势。 1.1 微服务架构面临的挑战 …

学习委员之作业管理系统—前端部分

拯救学习委员之作业管理系统—前端部分 项目背景 学习委员收集作业的过程,繁琐且曲折,作者充分理解并体谅为大家服务的苦逼学习委员,以此为出发点和灵感,设计并开发了此套作业管理系统,希望能帮助各位提高效率&#…

语义检索系统【三】:基于Milvus 搭建召回系统抽取向量进行检索,加速索引

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

[openCV]基于拟合中线的智能车巡线方案V4

import cv2 as cv import os import numpy as np# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir:文件夹根目录输入 ext: 扩展名返回: 文件路径列表"""newDir d…

Linux(四)--包软件管理器与Linux上软件的下载示例

一.包软件管理器【yum和apt】 1.先来学习使用yum命令。yum:RPM包软件管理器,用于自动化安装配置Linux软件,并可以自动解决依赖问题。通过yum命令我们可以轻松实现软件的下载,查找,卸载与更新等管理软件的操作。 最常用…

线程池-手写线程池Linux C简单版本(生产者-消费者模型)

目录 简介手写线程池线程池结构体分析task_ttask_queue_tthread_pool_t 线程池函数分析thread_pool_createthread_pool_postthread_workerthread_pool_destroywait_all_donethread_pool_free 主函数调用 运行结果 简介 本线程池采用C语言实现 线程池的场景: 当某些…

Delphi 开发的QR二维码生成工具,开箱即用

目录 一、基本功能: 二、使用说明: 三、操作演示gif 四、下载链接 在日常的开发中,经常需要将一个链接生成为二维码图片,特别是在进行支付开发的时候,因为我们支付后台获取了支付链接,需要变成二维码扫…

设计模式行为型——解释器模式

目录 什么是解释器模式 解释器模式的实现 解释器模式角色 解释器模式类图 解释器模式举例 解释器模式代码实现 解释器模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是解释器模式 解释器模式(Interpreter Pattern)属于行为型模式&…

SOLIDWORKS中的弹簧设计指南

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件,可以用于设计各种机械零件和组件,包括弹簧。在SOLIDWORKS中设计弹簧需要注意一些关键点,本文将为您介绍SOLIDWORKS中的弹簧设计指南。 1. 弹簧类型 按受力性质,弹簧类型包括压…

小程序云开发快速入门(1/4)

前言 从上次完成了码仔备忘录本地版本后,码仔就养成了每天记录备忘录的好习惯,每周早上会记录下自己要做的任务,然后晚上在复盘一下今天的计划是否完成。 有一天,码仔看到它最喜欢的码妞在一旁愁眉苦脸。 码仔:“怎么…

5个设计师必备的绘画工具,不看错亿

在设计工作中,绘画工具是设计师经常会用到的设计工具,今天本文将与大家分享5个好用的绘画工具,一起来看看吧! 1、即时灵感 即时灵感是一款非常受欢迎的绘画工具,它为设计师提供了自由的绘画方式,也提供了…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

091.粉刷房子

一、题目 剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minCost(vector<vector<int>>& costs) {int row costs.size();int col costs[0].size();if (row 1)return min(min(costs[0][0], cos…

Liunx开发工具

Liunx开发工具 1.Linux编辑器-vim使用1.1vim的基本概念1.2vim的基本操作1.3命令模式命令集1.3.1光标定位1.3.2光标移动1.3.3文本复制1.3.4文本操作 1.4插入模式命令集1.5底行模式命令集 2.vim配置3.sudo配置4.Linux编辑器-gcc/g使用4.1背景知识4.2gcc如何操作 5.函数库5.1函数库…

ES6 - generator和async函数

一、前言 ES6 诞生以前&#xff0c;异步编程的方法&#xff0c;大概有下面四种。 回调函数事件监听发布/订阅Promise 对象 回调函数本身并没有问题&#xff0c;它的问题出现在多个回调函数嵌套会造成回调地狱&#xff0c;非常不利于代码的维护和逻辑混乱等问题&#xff1b; …

数论分块学习笔记

准备开始复习莫比乌斯反演&#xff0c;杜教筛这一部分&#xff0c;先复习一下数论分块 0.随便说说 数论分块可以计算如下形式的式子 ∑ i 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum_{i1}^{n}f(i)g(\lfloor\frac{n}{i}\rfloor) ∑i1n​f(i)g(⌊in​⌋)。 利用的原理是 ⌊ n i ⌋ \lf…

StarRocks数据库部署全记录(保姆式帮助你初次体验StarRocks)

因业务需要&#xff0c;特此了解StarRocks产品和部署。 接触过程中发现指导资料很稀少&#xff0c;本人将结合官方的手册其他开源博主指导&#xff0c;将第一次接触到的概念和部署流程梳理&#xff0c;得出本文。 已有的资源中对细节介绍欠缺&#xff0c;导致我本人整个过程中花…