LeetCode Hot100 刷题笔记(3)—— 链表

news2025/4/8 3:29:21

目录

前言

1. 相交链表

2. 反转链表

3. 回文链表

4. 环形链表

5. 环形链表 II

6. 合并两个有序链表

7. 两数相加

8. 删除链表的倒数第 N 个结点

9. 两两交换链表中的节点

10. K 个一组翻转链表

11. 随机链表的复制

12. 排序链表

13. 合并 K 个升序链表

14. LRU 缓存


前言

一、链表:相交链表,反转链表,回文链表,环形链表,环形链表 II,合并两个有序链表,两数相加,删除链表的倒数第 N 个结点,两两交换链表中的节点,K 个一组翻转链表,随机链表的复制,排序链表,合并 K 个升序链表,LRU 缓存。(日更中...)

*** Trick:本质将链表转为list,再在list上进行操作,最后转回链表。

*** Trick 通用模版

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

class Solution(object):
    def Operation(self, head):
        if not head:
            return None
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        """
        系列操作
        """
        head_new = ListNode(int(lst[0]))
        curr = head_new
        for v in lst[1:]:
            curr.next = ListNode(int(v))
            curr = curr.next
        return head_new

1. 相交链表

原题链接:160. 相交链表 - 力扣(LeetCode)

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        set1 = set()
        while headA:
            set1.add(headA)
            headA = headA.next
        while headB:
            if headB in set1:
                return headB
            headB = headB.next
        return None

2. 反转链表

原题链接:206. 反转链表 - 力扣(LeetCode)

class Solution(object):
    def reverseList(self, head):
        if not head:
            return None
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        lst.reverse()

        head_new = ListNode(int(lst[0]))
        curr = head_new
        for v in lst[1:]:
            curr.next = ListNode(int(v))
            curr = curr.next
        return head_new

3. 回文链表

原题链接:234. 回文链表 - 力扣(LeetCode)

class Solution(object):
    def isPalindrome(self, head):
        if not head:
            return None
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        if lst == lst[::-1]:
            return True
        return False

4. 环形链表

原题链接:141. 环形链表 - 力扣(LeetCode)

class Solution(object):
    def hasCycle(self, head):
        if not head:
            return False
        set1 = set()
        while head:
            set1.add(head)
            head = head.next
            if head in set1:
                return True
        return False

5. 环形链表 II

原题链接:142. 环形链表 II - 力扣(LeetCode)

class Solution(object):
    def detectCycle(self, head):
        if not head:
            return None
        set1 = set()
        while head:
            set1.add(head)
            head = head.next
            if head in set1:
                return head
        return None

6. 合并两个有序链表

原题链接:21. 合并两个有序链表 - 力扣(LeetCode)

class Solution(object):
    def mergeTwoLists(self, list1, list2):
        if not list1 and not list2:
            return None
        elif not list1:
            return list2
        elif not list2:
            return list1
        else:
            lst1, lst2 = [], []
            while list1:
                lst1.append(list1.val)
                list1 = list1.next
            while list2:
                lst2.append(list2.val)
                list2 = list2.next
            lst = lst1 + lst2
            lst.sort()

            head = ListNode(int(lst[0]))
            curr = head
            for v in lst[1:]:
                curr.next = ListNode(int(v))
                curr = curr.next
            return head

7. 两数相加

原题链接:2. 两数相加 - 力扣(LeetCode)

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        lst1, lst2 = [], []
        while l1:
            lst1.append(l1.val)
            l1 = l1.next
        while l2:
            lst2.append(l2.val)
            l2 = l2.next
        # s1 = ''.join(l1)
        # s2 = ''.join(l2)
        lst1.reverse()
        lst2.reverse()
        s1 = ''.join([str(i) for i in lst1])
        s2 = ''.join([str(i) for i in lst2])
        s3 = int(s1) + int(s2)
        lst3 = list(str(s3))
        lst3.reverse()

        head = ListNode(int(lst3[0]))
        curr = head
        for v in lst3[1:]:
            curr.next = ListNode(int(v))
            curr = curr.next
        return head
        

8. 删除链表的倒数第 N 个结点

原题链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

class Solution(object):
    def removeNthFromEnd(self, head, n):
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        del lst[-n]
        if not lst:
            return None
        else:
            head_new = ListNode(lst[0])
            curr = head_new
            for v in lst[1:]:
                curr.next = ListNode(v)
                curr = curr.next
            return head_new

9. 两两交换链表中的节点

原题链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

class Solution(object):
    def swapPairs(self, head):
        if not head:
            return None
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        for i in range(0, len(lst)-1, 2):
            lst[i], lst[i+1] = lst[i+1], lst[i]
        head_new = ListNode(lst[0])
        curr = head_new
        for value in lst[1:]:
            curr.next = ListNode(value)
            curr = curr.next
        return head_new

10. K 个一组翻转链表

原题链接:25. K 个一组翻转链表 - 力扣(LeetCode)

class Solution(object):
    def reverseKGroup(self, head, k):
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        for i in range(0, len(lst)-k+1, k):
            lst[i:i+k] = lst[i:i+k][::-1]

        head_new = ListNode(lst[0])
        curr = head_new
        for v in lst[1:]:
            curr.next = ListNode(v)
            curr = curr.next
        return head_new

11. 随机链表的复制

原题链接:138. 随机链表的复制 - 力扣(LeetCode)

class Node:
    def __init__(self, x, next=None, random=None):
        self.val = int(x)
        self.next = next
        self.random = random


class Solution(object):
    def copyRandomList(self, head):
        return copy.deepcopy(head)

12. 排序链表

原题链接:148. 排序链表 - 力扣(LeetCode)

class Solution(object):
    def sortList(self, head):
        if not head:
            return None
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        lst.sort()
         
        head_new = ListNode(int(lst[0]))
        curr = head_new
        for v in lst[1:]:
            curr.next = ListNode(int(v))
            curr = curr.next
        return head_new

13. 合并 K 个升序链表

原题链接:23. 合并 K 个升序链表 - 力扣(LeetCode)

class Solution(object):
    def mergeKLists(self, lists):
        if not lists:
            return None
        lst1 = []
        for head in lists:
            lst2 = []
            while head:
                lst2.append(head.val)
                head = head.next
            lst1.append(lst2)
        lst1 = sum(lst1, [])  
        if not lst1:
            return None      # lst1 = [[]]

        lst1.sort()
        head_new = ListNode(lst1[0])
        curr = head_new
        for v in lst1[1:]:
            curr.next = ListNode(v)
            curr = curr.next
        return head_new

14. LRU 缓存

原题链接:

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

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

相关文章

状态机思想编程

1. LED流水灯的FPGA代码 在这个任务中,首先我们会使用状态机的思想来设计一个LED流水灯的控制逻辑。LED流水灯一般需要依次点亮不同的LED,并且循环播放。我们将其分为几个状态,每个状态控制一个或一组LED灯。 状态机设计 假设我们有8个LED…

第二十八章:Python可视化图表扩展-和弦图、旭日图、六边形箱图、桑基图和主题流图

一、引言 在数据可视化领域,除了常见的折线图、柱状图和散点图,还有一些高级图表类型可以帮助我们更直观地展示复杂数据关系。本文将介绍五种扩展图表:和弦图、旭日图、六边形箱图、桑基图和主题流图。这些图表在展示数据关系、层次结构和流量…

基于vue框架的重庆美食网站的设计与实现kt945(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,美食分类,美食菜品 开题报告内容 基于Vue框架的重庆美食网站的设计与实现开题报告 一、选题背景与意义 (一)选题背景 重庆,作为中国西南地区的璀璨明珠,以其独特的地理位置和丰富…

Metal学习笔记十三:阴影

在本章中,您将了解阴影。阴影表示表面上没有光。当另一个表面或对象使对象与光线相遮挡时,您会看到对象上的阴影。在项目中添加阴影可使您的场景看起来更逼真,并提供深度感。 阴影贴图 阴影贴图是包含场景阴影信息的纹理。当光线照射到物体…

时间梯度匹配损失 TGMLoss

目录 时间梯度匹配损失(Temporal Gradient Matching Loss, TGM Loss) 完整示例,该损失函数常用于视频预测、运动平滑等任务,通过约束预测序列的时间梯度与真实序列一致来提升时序连续性 训练测试demo代码: 时间梯度匹配损失(Temporal Gradient Matching Loss, TGM Los…

iPhone XR:一代神机,止步于此

什么样的 iPhone ,才配称为一代神机? 我曾经用过iPhone 4S、iPhone 6S Plus、iPhone 8 Plus,iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷,不管囊中是否羞涩,主力机基本没考…

第十四届蓝桥杯省赛真题解析(含C++详细源码)

第十四届蓝桥杯省赛 整数删除满分思路及代码solution1 (40% 双指针暴力枚举)solution 2(优先队列模拟链表 AC) 冶炼金属满分代码及思路 子串简写满分思路及代码solution 1(60% 双指针)solution 2&#xff0…

OpenAI即将开源!DeepSeek“逼宫”下,AI争夺战将走向何方?

OpenAI 终于要 Open 了。 北京时间 4 月 1 日凌晨,OpenAI 正式宣布:将在未来几个月内开源一款具备推理能力的语言模型,并开放训练权重参数。这是自 2019 年 GPT-2 部分开源以来,OpenAI 首次向公众开放核心模型技术。 【图片来源于…

mysql 8.0.27-docker

安装 可以略过本步 https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/ 镜像查询与安装 先查询: docker search mysql 明显会报错 Error response from daemon: Get "https://index.docker.io/v1/search?qmysql&n25": dial tcp…

使用NVM下载Node.js管理多版本

提示:我解决这个bug跟别人思路可能不太一样,因为我是之前好用,换个项目就不好使了,倦了 文章目录 前言项目场景一项目场景二解决方案:下载 nvm安装 nvm重新下载所需Node 版本nvm常用命令 项目结构说明 前言 提示&…

Linux——文件(2)文件系统

我们知道,文件在没有被打开时是放在磁盘中的,通常我们未打开的文件数量要远远大于打开的文件数量,而且我们要想打开一个文件,首先需要知道文件在磁盘的位置才能打开,但问题是,面对磁盘中成百上千个文件&…

蓝桥杯 web 水果拼盘 (css3)

做题步骤: 看结构:html 、css 、f12 分析: f12 查看元素,你会发现水果的高度刚好和拼盘的高度一样,每一种水果的盘子刚好把页面填满了,所以咱们就只要让元素竖着排列,加上是竖着,排不下的换行…

【eNSP实验】RIP协议

RIP协议介绍 RIP(路由信息协议)是一种基于距离向量的内部网关协议,适用于小型网络。它通过跳数(最多15跳)衡量路径成本,定期与相邻路由器交换路由表。RIPv1使用广播更新且不支持子网,RIPv2新增…

JAVA反序列化深入学习(十三):Spring2

让我们回到Spring Spring2 在 Spring1 的触发链上有所变换: 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy ,并完成了后续触发 TemplatesImpl 的流程 简而言之,换了一个chain&am…

Matlab:三维绘图

目录 1.三维曲线绘图命令:plot3 实例——绘制空间直线 实例——绘制三角曲线 2.三维曲线绘图命令:explot3 3.三维网格命令:mesh 实例——绘制网格面 实例——绘制山峰曲面 实例——绘制函数曲线 1.三维曲线绘图命令:plot3 …

学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换

本文是我的《学透Spring Boot》专栏的第16篇文章,了解更多请移步我的专栏: Postnull的专栏《学透Spring Boot》 目录 遇到问题 日期格式的转换 实现需求 创建转换器 注册转换器 编写Controller 访问测试 存在的问题 解决问题 源码分析 总结 …

Spring Boot开发三板斧:高效构建企业级应用的核心技法

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术&#xff0c…

手搓多模态-03 顶层和嵌入层的搭建

声明:本代码非原创,是博主跟着国外大佬的视频教程编写的,本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分,这一部分的主要功能是接收一个batch的图像,并将其转化为上下文相关的嵌入向量,…

【经验分享】将qt的ui文件转换为py文件

🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 首先简单的设计一个U…

探秘JVM内部

在我们编写Java代码,点击运行后,会发生什么事呢? 首先,Java源代码会经过Java编译器将其编译成字节码,放在.class文件中 然后这些字节码文件就会被加载到jvm中,然后jvm会读取这些文件,调用相关…