《热题101》链表篇

news2024/12/24 21:52:59

思路:之前有反转链表前n个值、以及反转指定区间的链表,所以这个我只想在这两个基础上实现。用左右指针来确定当前反转的区间,每次反转之前都检查一下当前区间是否足够k,即区间之后的节点cur,足够就可以反转,反转之后找到当前的cur,循环反转。

class Solution:

    p = None

    def reverse(self,head,l):

        if l == 1:

            self.p = head.next

            return head

        last = self.reverse(head.next,l-1)

        head.next.next = head

        head.next = self.p

        return last

    def reverselr(self,head,l,r):

        if l == 1:

            return self.reverse(head,r)

        head.next = self.reverselr(head.next,l-1,r-1)

        return head

    def reverseKGroup(self , head: ListNode, k: int) -> ListNode:

        cur = head

        left = 1

        right = 1

        while cur:

            while right - left < k - 1 and cur: #如果当前左右差足够k并且cur存在,找下一个cur

                cur = cur.next

                right += 1

            if cur:

                head = self.reverselr(head,left,right) #反转部分

                p = head #重新找当前的cur位置

                for i in range(right):

                    p = p.next

                cur = p

                left = right + 1 #更新左右

                right = left

        return head

 

思路:二分,两两合并,然后再次两两合并,直到只剩一个链表。 

class Solution:

    def mergetwo(self,list1,list2):

        dump = ListNode(-1)

        p = dump

        p1 = list1

        p2 = list2

        while p1 and p2:

            if p1.val < p2.val:

                p.next = p1

                p1 = p1.next

            else:

                p.next = p2

                p2 = p2.next

            p = p.next

        if p1:

            p.next = p1

        if p2:

            p.next = p2

        return dump.next

    def mergeKLists(self , lists: List[ListNode]) -> ListNode:

        k = len(lists)

        if k == 1:

            return lists[0]

        if k == 0:

            return None

        left = 0 if k % 2 == 0 else 1 #如果k是奇数,就先两两合并剩下的

        first = lists[0] if left == 1 else None

        right = k - 1

        res = []

        while left < right:

            a = self.mergetwo(lists[left],lists[right])

            left += 1

            right -= 1

            res.append(a) #新链表数组

            if right == left: #如果左右相等

                res.append(lists[left]) #数组加入当前链表,重新合并下一轮

                lists = res

                right = len(res) - 1

                left = 0

                res = []

            elif right < left and len(res) > 1:#如果左右不等并且res没有合并到最后

                left = 0

                right = len(res) - 1 #合并下一轮

                lists = res

                res = []

        ans = self.mergetwo(res[0],first) #考虑到第一个链表

        return ans

思路:反转两个链表,然后开始加和对应的值,用和%10当做此次的value来新增节点,和//10作为进位。当两个链表都走到最后了,查看进位值是否为1,如果是就再新增一个节点,如果不是,就把全部新增节点反转输出。 

class Solution:

    def reverse(self,head):

        if head is None or head.next is None:

            return head

        last = self.reverse(head.next)

        head.next.next = head

        head.next = None

        return last

    def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:

        head1 = self.reverse(head1)

        head2 = self.reverse(head2)

        add = 0  #进位

        ans = ListNode(-1)  #设置头结点

        p = ans

        while head1 and head2: #依次加和

            value = (head1.val + head2.val + add) % 10

            add = (head1.val + head2.val + add) // 10

            p.next = ListNode(value)

            p = p.next

            head1 = head1.next

            head2 = head2.next

        while head1: #加和剩下的链表

            value = (head1.val+add) % 10

            add = (head1.val+add) // 10

            p.next = ListNode(value)

            p = p.next

            head1 = head1.next

        while head2: #加和剩下的链表

            value = (head2.val+add) % 10

            add = (head2.val+add) // 10

            p.next = ListNode(value)

            p = p.next

            head2 = head2.next

        if add: #最后查看是否还有进位

            p.next = ListNode(add)

            p = p.next

        return self.reverse(ans.next) #返回新增链表的反转

思路:先遍历一次链表,用数组存储,然后快排数组,最后将数组转化成链表

import random

class Solution:

    def paixu(self,num):

        if len(num) <= 1:

            return num

        p = random.choice(num)

        left = self.paixu([i for i in num if i < p])

        right = self.paixu([i for i in num if i > p])

        same = [i for i in num if i == p]

        return left+same+right

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

        if head is None or head.next is None:

            return head

        num = []

        while head: #遍历链表

            num.append(head.val)

            head = head.next

        nums = self.paixu(num) #快排数组

        dump = ListNode(-1)

        p = dump

        for i in nums: #重组链表

            p.next = ListNode(i)

            p = p.next

        return dump.next

思路:将链表转化成数组,然后比较num==num[::-1]

class Solution:

    def isPail(self , head: ListNode) -> bool:

        if head is None or head.next is None:

            return True

        num = []

        while head:

            num.append(head.val)

            head = head.next

        return num == num[::-1]

思路:设置奇偶位,然后先移动奇位,将数据加入新建链表中,然后再移动偶位,将数据加入新建链表中。最后输出新建链表。

class Solution:

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

        if head is None or head.next is None or head.next.next is None: #特殊判断

            return head

        odd = head

        even = head.next

        dump = ListNode(-1)

        p = dump

        while odd or even:

            if odd:

                p.next = ListNode(odd.val)

                if odd.next:

                    odd = odd.next.next

                else:

                    odd = odd.next

            else:

                p.next = ListNode(even.val)

                if even.next:

                    even = even.next.next

                else:

                    even = even.next

            p = p.next

        return dump.next

思路:遍历链表,如果当前值等于下一个值,就删除下一个节点,如果不等于就移动指针到下一位。

class Solution:

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

        if head is None or head.next is None:

            return head

        p = head

        while p and p.next:

            if p.val == p.next.val: #如果等,就删下一个节点

                p.next = p.next.next

            else: #不等就移动指针

                p = p.next

        return head

思路:因为是升序链表,设置头结点(为了删除head),如果dump.next.val==dump.next.next.val ,记录当前的value值,删除所有值是value的节点。如果不等,就移动指针。

class Solution:

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

        if head is None or head.next is None:

            return head

        dump = ListNode(-1)

        dump.next = head

        p = dump

        while p.next and p.next.next:

            if p.next.val == p.next.next.val: #如果值相等

                value = p.next.val

                while p.next and p.next.val == value:

                    p.next = p.next.next

            else: #如果值不等

                p = p.next

        return dump.next

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

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

相关文章

【Flink】Flink架构及组件

我们学习大数据知识的时候&#xff0c;需要知道大数据组件如何安装以及架构组件&#xff0c;这将帮助我们更好的了解大数据组件 对于大数据Flink&#xff0c;架构图图下&#xff1a; 整个架构图有三种关键组件 1、Client&#xff1a;负责作业的提交。调用程序的 main 方法&am…

基于乌鸦算法优化的BP神经网络(预测应用) - 附代码

基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于乌鸦算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.乌鸦优化BP神经网络2.1 BP神经网络参数设置2.2 乌鸦算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Spring练习31---用户添加操作--添加数据到数据库,最终添加讲师,助教操作最终完毕

视频链接&#xff1a;16-Spring练习-用户添加操作-添加数据到数据库_哔哩哔哩_bilibili 104 1、当你点击提交时&#xff0c;form表单进行提交 2、这个名字必须跟你当前封装的属性名一样 3、要封装跟user的属性名一样&#xff0c;这样springMVc才能自动封装进去 4、提交时选择r…

Cyanine5-alkyne在无机纳米领域的应用-星戈瑞

​欢迎来到星戈瑞荧光stargraydye&#xff01;小编带您盘点&#xff1a; Cyanine5-alkyne在无机纳米领域也有着诸多的应用&#xff0c;主要体现在以下几个方面&#xff1a; **1. 纳米颗粒表面功能化&#xff1a;**Cyanine5-alkyne作为反应性的炔基官能团&#xff0c;可以与含有…

springboot之@Async异步定时任务自定义线程池

在应用中经常会遇到定时执行任务的需求&#xff0c;这时采用异步的方式开启一个定时任务&#xff0c;通常引用Async注解&#xff0c;但直接使用会有风险&#xff0c;当我们没有指定线程池时&#xff0c;会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池&#xff0c;会…

Elasticsearch Split和shrink API

背景&#xff1a; 尝试解决如下问题&#xff1a;单分片存在过多文档&#xff0c;超过lucene限制 分析 1.一般为日志数据或者OLAP数据&#xff0c;直接删除索引重建 2.尝试保留索引&#xff0c;生成新索引 - 数据写入新索引&#xff0c;查询时候包含 old_index,new_index 3.…

一、数据库基础

数据库 一、数据库基础 1、一些概念 数据库&#xff1a;数据库&#xff08;DataBase &#xff0c;简称DB&#xff09;&#xff0c;就是信息的集合。数据库是由数据库管理系统管理的数据的集合&#xff1b;数据库管理系统&#xff1a;简称DBMS 。是一种操纵和管理数据库的大型…

听GPT 讲Prometheus源代码--tsdb

题图来自 Prometheus TSDB (Part 1): The Head Block[1] tsdb 目录在 Prometheus 项目中承担了实现时间序列数据库&#xff08;Time Series Database&#xff09;的功能。Prometheus 使用这个自定义的时间序列数据库来高效地存储和查询监控数据。 在 tsdb 目录下&#xff0c;有…

这所C9无歧视!专业课简单,平均130分!

一、学校及专业介绍 哈尔滨工业大学&#xff08;Harbin Institute of Technology&#xff0c;简称哈工大&#xff09;&#xff0c;是隶属于工业和信息化部的全国重点大学&#xff0c;位于哈尔滨市&#xff0c;九校联盟“C9”之一&#xff0c;位列国家“双一流”、“985工程”、…

连接未来 驱动创新|腾讯云 CODING DevOps 主题沙龙诚邀您的参与

点击链接了解详情 随着企业数字化转型步入深水区&#xff0c;DevOps 作为数字化转型关键的内建阶段&#xff0c;其应用和实施已经成为企业提升研发效率&#xff0c;实现快速迭代和持续交付的重要手段。然而如何有效地实施 DevOps&#xff0c;如何利用 DevOps 推动业务发展和创新…

Wireshark数据抓包分析之UDP协议

一、实验目的&#xff1a; 通过使用wireshark对UDP数据包的抓取分析UDP协议的内容 二、预备知识&#xff1a; UDP协议的概念&#xff1a;UDP使用底层的互联网协议来传送报文&#xff0c;同IP一样提供不可靠的无连接传输服务。它也不提供报文到达确认、排序及流量控制等功能。 …

kafka复习:(4)为什么默认情况下相同的key不为空的消息会被存储到相同的分区

默认分区器DefaultPartitioner的分区代码&#xff1a; 可以看到&#xff0c;消息最终落在哪个分区就是由总计有几个分区以及key的值来决定的。

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks [2022 CVPR]

长期以来&#xff0c;仅使用单视角二维照片集无监督生成高质量多视角一致图像和三维形状一直是一项挑战。现有的三维 GAN 要么计算密集&#xff0c;要么做出的近似值与三维不一致&#xff1b;前者限制了生成图像的质量和分辨率&#xff0c;后者则对多视角一致性和形状质量产生不…

推荐这11个平面设计软件,平面设计师必备好物

今天本文整理了大厂设计师都在用的平面设计软件&#xff0c;为设计师的平面设计工作高效赋能&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是国内很多设计师或者设计团队都在用的平面设计软件&#xff0c;它能为个人设计师带来丰富的创作力和多样的平面设计功能…

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件&#xff0c;自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor&#xff0c;创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…

ssm网上医院预约挂号系统源码和论文

ssm网上医院预约挂号系统源码和论文051 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式…

SpringCloud教程 | 第五篇: 路由网关(zuul)

在微服务架构中&#xff0c;需要几个基础的服务治理组件&#xff0c;包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等&#xff0c;由这几个基础组件相互协作&#xff0c;共同组建了一个简单的微服务系统。一个简单的微服务系统如下图&#xff1a; 注意&…

interview1-DB篇

需要项目经验可自行上Gitee寻找项目资源 一、Redis篇 1、缓存 缓存的要点可分为穿透、击穿、雪崩&#xff0c;双写一致、持久化&#xff0c;数据过期、淘汰策略。 &#xff08;1&#xff09;穿透、击穿、雪崩 1.缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据…

Ansible学习笔记(一)

1.什么是Ansible 官方网站&#xff1a;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具&#xff0c;类似于Chef&#xff0c;Puppet或Salt。这是一款很简单也很容易入门的部署工具&#xff0c;它使用SS…

Linux学习记录——이십오 多线程(2)

文章目录 1、理解原生线程库线程局部存储 2、互斥1、并发代码&#xff08;抢票&#xff09;2、锁3、互斥锁的实现原理 3、线程封装1、线程本体2、封装锁 4、线程安全5、死锁6、线程同步1、条件变量1、接口2、demo代码 1、理解原生线程库 线程库在物理内存中存在&#xff0c;也…