【力扣hot100】刷题笔记Day9

前言

  • 阴天睡得还挺舒服,9点半才醒,用刷题开启美好新一天!

141. 环形链表 - 力扣(LeetCode)

  • 哈希表

    • class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:seen = set()  # 哈希集合# seen = {}  # 哈希字典cur = headwhile cur:if cur in seen:  # 有重复的节点则有环return Trueseen.add(cur)  # 直接存节点# seen[cur] = True  # 将节点作为键,值设为Truecur = cur.nextreturn False
  • 快慢指针

    • class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:slow = fast = head  # 乌龟和兔子同时从起点出发while fast and fast.next:slow = slow.next  # 乌龟走一步fast = fast.next.next  # 兔子走两步if fast == slow:  # 兔子追上乌龟(套圈),说明有环return Truereturn False  # 访问到了链表末尾,无环

142. 环形链表 II - 力扣(LeetCode)

  • 快慢指针

    • class Solution:def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:fast = slow = headwhile fast and fast.next:fast = fast.next.nextslow = slow.nextif slow == fast:  # 快慢指针相遇,s走了nb,f走了2nbfast = head  # 入口处需要a+nb,s已经走了nbwhile fast != slow:  # 同时走a就可到达入口fast = fast.nextslow = slow.nextreturn fastreturn None

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

  • 迭代法

    • class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:prehead = ListNode(-1)precur = preheadwhile list1 and list2:if list1.val <= list2.val:  # 把较小值接到precur后面precur.next = list1list1 = list1.nextelse:precur.next = list2list2 = list2.nextprecur = precur.next  # 记得让precur前进# 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可precur.next = list1 if list1 else list2return prehead.next
  • 递归法

    • class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:if list1 is None:return list2if list2 is None:return list1if list1.val < list2.val:list1.next = self.mergeTwoLists(list1.next, list2)return list1else:list2.next = self.mergeTwoLists(list2.next, list1)return list2

 2. 两数相加 - 力扣(LeetCode)

  • 模拟——转数字

    • class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 链表转化为数字def getNum(head):num = 0flag = 1while head != None:num += head.val * flaghead = head.nextflag *= 10return num# 计算和    twoSum = getNum(l1) + getNum(l2)# 和为0直接返回0节点if twoSum == 0:return ListNode(0)# 循环生成新链表head = cur = ListNode(-1)while twoSum != 0:cur.next = ListNode(twoSum % 10)cur = cur.nexttwoSum //= 10  # 整除return head.next
  • 模拟——进位

    • class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:# 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历dummy = p = ListNode(None)          s = 0               # 初始化进位 s 为 0while l1 or l2 or s:# 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)s += (l1.val if l1 else 0) + (l2.val if l2 else 0)  p.next = ListNode(s % 10)       # p.next 指向新链表, 用来创建一个新的链表p = p.next                      # p 向后遍历s //= 10                        # 有进位情况则取模, eg. s = 18, 18 // 10 = 1l1 = l1.next if l1 else None    # 如果l1存在, 则向后遍历, 否则为 Nonel2 = l2.next if l2 else None    # 如果l2存在, 则向后遍历, 否则为 Nonereturn dummy.next   # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点
  • 递归——进位

    • class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:def dfs(l, r, i):# 终止条件:都为空节点且进位为0if not l and not r and not i: return Nones = (l.val if l else 0) + (r.val if r else 0) + inode = ListNode(s % 10)  # 当前节点node.next = dfs(l.next if l else None, r.next if r else None, s // 10) # 接上递归链表return nodereturn dfs(l1, l2, 0)

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

  • 双指针

    • class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:dummy = ListNode(0, head)  # 直接创建虚拟头节点fast = slow = dummy  # 双指针# 快指针先走while n != 0:fast = fast.nextn -= 1# 双指针一起走直到fast到底while fast.next != None:fast = fast.nextslow = slow.next# 删除节点slow.next = slow.next.nextreturn dummy.next

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

  • 模拟 ​​​​​

    • class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummy = ListNode(0, head)cur = dummywhile cur.next and cur.next.next:pre = curcur = cur.nexttemp = cur.next.nextpre.next = cur.next  # 步骤1pre.next.next = cur  # 步骤2cur.next = temp      # 步骤3return dummy.next
  • 递归

    • class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:# 终止条件:如果剩0/1个节点,无法交换,直接返回if not head or not head.next:return head# 交换头两个结点newhead = head.nexthead.next = self.swapPairs(newhead.next)  # 接上后面交换好的结果newhead.next = headreturn newhead

后言

  • 明天估计是不开组会的,今天猛猛刷了6道题!知识能进脑子的感觉真爽啊! 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 面试题】MySQL与Redis 如何保证双写一致性

目录 方案一:延时双删方案二: 删除缓存重试机制方案三:读取biglog异步删除缓存系列文章版本记录方案一:延时双删 延时双删流程 先删除缓存再更新数据库休眠一会(比如1秒),再次删除缓存。这个休眠一会,一般多久呢?都是1秒? 这个休眠时间 = 读业务逻辑数据

dell戴尔电脑灵越系列Inspiron 15 3520原厂Win11系统中文版/英文版

Dell戴尔笔记本灵越3520原装出厂Windows11系统包&#xff0c;恢复出厂开箱预装OEM系统 链接&#xff1a;https://pan.baidu.com/s/1mMOAnvXz5NCDO_KImHR5gQ?pwd3nvw 提取码&#xff1a;3nvw 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、MyD…

Leo赠书活动-18期 《高效使用Redis》

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

基于springboot+vue的智能推荐的卫生健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

按键输入及主频与时钟配置实验

1.按键输入实验 按键输入简介 按键就两个状态&#xff1a;按下或弹起&#xff0c;将按键连接到一个 IO 上&#xff0c;通过读取这个 IO 的值就知道按 键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。前 面几章我们都是讲解 I.MX6U 的…

亿道丨三防平板pad丨三防平板是指哪三防丨三防工业级平板电脑

三防工业级平板电脑成为许多行业中的重要工具。本文将介绍三防工业级平板电脑的特点以及其在各个领域中的广泛应用。 三防工业级平板电脑的特点 三防工业级平板电脑是指具备防水、防尘和防震功能的平板电脑。这些特点使得它们能够在恶劣环境中工作&#xff0c;如沙尘飞扬的工地…

基于java springboot+mybatis OA办公自动化系统设计和实现

基于java springbootmybatis OA办公自动化系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

普中51单片机学习(串口通信)

串口通信 原理 计算机通信是将计算机技术和通信技术的相结合&#xff0c;完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类&#xff1a;并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送 。控制简单、传输速度快&#xff1…

【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

RK3568平台开发系列讲解(Linux系统篇)通过I2C总线访问客户端方法

🚀返回专栏总目录 文章目录 一、普通I2C通信二、系统管理总线(SMBus)兼容函数三、在开发板配置文件中实例化I2C设备(弃用的旧方式)沉淀、分享、成长,让自己和他人都能有所收获!😄 串行总线事务只是访问寄存器来设置/获取其内容。I2C遵循该规则。I2C内核提供两种API,…

如何利用内网穿透工具在企业微信开发者中心实现本地接口服务回调

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

2023年Q4,SSD出货量下降5%,但存储容量增长9.6%

2023年第四季度&#xff08;4Q23&#xff09;的SSD市场表现呈现出单位出货量下降&#xff0c;但存储容量增长的趋势。具体数据显示&#xff0c;该季度SSD总出货量下降5%&#xff0c;降至8820万台&#xff1b; 而存储容量则增长9.6%&#xff0c;达到85.1EB。预计2023全年SSD总容…