2024.6.7力扣刷题记录-链表篇学习记录

目录

一、学习视频

二、视频跟练

1.206. 反转链表

2.92. 反转链表 II

3.25. K 个一组翻转链表

三、课后习题

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

(1)循环两次

 (2)直接反转

(3)递归

2.445. 两数相加 II

(1)迭代-原地修改-错误

(2)迭代-开新链表

(3)递归

 (4)栈

3.2816. 翻倍以链表形式表示的数字

(1)栈-原地-三次遍历

(2)栈-新建链表-两次遍历

(3)反转链表-原地修改-两次遍历

(4)一次遍历

(5)一次遍历2


一、学习视频

【反转链表】 https://www.bilibili.com/video/BV1sd4y1x7KN/?share_source=copy_web&vd_source=dc0e55cfae3b304619670a78444fd795

二、视频跟练

1.206. 反转链表

来自视频

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = headwhile cur:nxt = cur.nextcur.next = prepre = curcur = nxt return pre

2.92. 反转链表 II

来自视频

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:dummy = ListNode(next = head)   # 哨兵节点p0 = dummy# 到达反转开始位置for _ in range(left - 1):p0 = p0.next# 开始反转pre, cur = None, p0.nextfor _ in range(right - left + 1):nxt = cur.nextcur.next = prepre = curcur = nxt# 连接p0.next.next = curp0.next = prereturn dummy.next

3.25. K 个一组翻转链表

来自视频

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:# 获取链表长度n = 0cur = headwhile cur:n += 1cur = cur.nextdummy = ListNode(next = head)   # 哨兵节点pre = Nonecur = headp0 = dummywhile n >= k:n -= kfor _ in range(k):nxt = cur.next cur.next = prepre = curcur = nxtnxt = p0.next   # 这里是关键,p0.next是旋转后的cur的前一位p0.next.next = curp0.next = prep0 = nxt# pre = nxt   # 这里对pre进行更新'''这里为什么可以不用更新pre,当未更新时,cur指向pre时,cur是p0的下一个节点当进行拼接时,p0.next.next = cur,会改变当时cur的那一条指向所有更不更新没有关系'''return dummy.next

三、课后习题

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

(1)循环两次

k个节点循环的做法,此时k=2。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummy = ListNode(next = head)p0 = dummy     # p0和dummy最开始指向同一个节点cur = headpre = Nonewhile cur and cur.next:for _ in range(2):nxt = cur.nextcur.next = prepre = curcur = nxtnxt = p0.nextp0.next.next = curp0.next = prep0 = nxtreturn dummy.next

 (2)直接反转

两个为一组直接进行反转连接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:# 直接交换dummy = ListNode(next = head)p0 = dummypre = headwhile pre and pre.next:cur = pre.nextnxt = cur.nextp0.next = curcur.next = prepre.next = nxtp0 = prepre = nxtreturn dummy.next

(3)递归

来自官方题解(. - 力扣(LeetCode))。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:# 递归if not head or not head.next:return headnewhead = head.next     # 第二个节点p2# 将后面的节点(第二个后的)进行反转,反转后返回的部分连接在第一个节点p1的后面head.next = self.swapPairs(newhead.next)newhead.next = head     #p2后面接p1,反转return newhead

2.445. 两数相加 II

(1)迭代-原地修改-错误

当l1,l2遍历完但有进位时,会缺少节点,最好还是使用开新的储存空间的方法。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 迭代def transform(head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = headwhile cur:nxt = cur.nextcur.next = prepre = curcur = nxtreturn prel1 = transform(l1)l2 = transform(l2)pre1 = Nonecur1, cur2 = l1, l2# 假定l1长,将所有运算结果储存在l1上num = 0while cur1 and cur2:# 数字操作x = cur1.val + cur2.val + numnum = x // 10cur1.val = x % 10# 反转操作nxt = cur1.nextcur1.next = pre1pre1 = cur1cur1 = nxt# 迭代cur2 = cur2.nextif not cur1:cur1 = cur2while cur1:# 数字操作x = cur1.val + numnum = x // 10cur1.val = x % 10# 反转操作nxt = cur1.nextcur1.next = pre1pre1 = cur1cur1 = nxtreturn pre1

(2)迭代-开新链表

来自灵神题解(. - 力扣(LeetCode))。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:pre = Nonecur = headwhile cur:nxt = cur.nextcur.next = prepre = curcur = nxtreturn predef addTwo(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:cur = dummy = ListNode()carry = 0   # 进位while l1 or l2 or carry:if l1: carry += l1.valif l2: carry += l2.valcur.next = ListNode(carry % 10)cur = cur.nextcarry //= 10    # 注意更新if l1: l1 = l1.nextif l2: l2 = l2.nextreturn dummy.nextdef addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 迭代-开新链表l1 = self.reverseList(l1)l2 = self.reverseList(l2)newList = self.addTwo(l1, l2)return self.reverseList(newList)

(3)递归

来自灵神题解。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if not head or not head.next:return headnewhead = self.reverseList(head.next)   # 此时的头节点为原来链表的最后一个节点# 反转操作,此时相当于是对尾操作,与头节点无关head.next.next = headhead.next = None    # 尾节点return newheaddef addTwo(self, l1: Optional[ListNode], l2: Optional[ListNode], carry = 0) -> Optional[ListNode]:if not l1 and not l2:return ListNode(carry) if carry else Noneif not l1:l1, l2 = l2, l1     # 保证l1是非空的,便于返回carry += l1.val + (l2.val if l2 else 0)l1.val = carry % 10l1.next = self.addTwo(l1.next, l2.next if l2 else None, carry // 10)return l1def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 递归l1 = self.reverseList(l1)l2 = self.reverseList(l2)newList = self.addTwo(l1, l2)return self.reverseList(newList)

 (4)栈

来自官方题解(. - 力扣(LeetCode))。

先全部入栈,弹出一个运算一次头插一次。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:# 栈,运算顺序,后进先出s1, s2 = [], []# 全部入栈while l1:s1.append(l1.val)l1 = l1.nextwhile l2:s2.append(l2.val)l2 = l2.nextdummy = ListNode()carry = 0while s1 or s2 or carry:s = (0 if not s1 else s1.pop()) + (0 if not s2 else s2.pop()) + carrycarry, val = divmod(s, 10)dummy.next = ListNode(val, dummy.next)      # 头插法return dummy.next

3.2816. 翻倍以链表形式表示的数字

(1)栈-原地-三次遍历

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def doubleIt(self, head: Optional[ListNode]) -> Optional[ListNode]:# 栈-原地-三次遍历# 逆序运算可以使用栈start, end = [], []     # 运算,更新均使用栈cur = head# 入栈while cur:start.append(cur.val)cur = cur.next# 运算carry = 0while start:carry += start.pop() * 2end.append(carry % 10)carry //= 10# 更新答案dummy = ListNode(val = carry if carry else 0, next = head)cur = headwhile cur:cur.val = end.pop()cur = cur.nextreturn dummy if dummy.val else dummy.next

(2)栈-新建链表-两次遍历

又用到了栈,又用到了头插法,又新建节点,效率不是很高。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def doubleIt(self, head: Optional[ListNode]) -> Optional[ListNode]:# 栈-新建链表-两次遍历start = []cur = head# 入栈while cur:start.append(cur.val)cur = cur.next# 运算carry = 0dummy = ListNode()while start:carry += start.pop() * 2dummy.next = ListNode(val = carry % 10, next = dummy.next)carry //= 10if carry: dummy.next = ListNode(val = carry, next = dummy.next)return dummy.next

(3)反转链表-原地修改-两次遍历

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def doubleIt(self, head: Optional[ListNode]) -> Optional[ListNode]:# 反转链表-原地修改-两次遍历# 反转链表cur = headpre = Nonewhile cur:nxt = cur.nextcur.next = prepre = curcur = nxtcarry = 0cur = prepre = Nonewhile cur:# 运算carry += cur.val * 2cur.val = carry % 10carry //= 10# 反转nxt = cur.nextcur.next = prepre = curcur = nxtdummy = ListNode(next = pre)if carry: dummy.next = ListNode(val = carry, next = dummy.next)return dummy.next

(4)一次遍历

来自灵神题解(. - 力扣(LeetCode))。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def doubleIt(self, head: Optional[ListNode]) -> Optional[ListNode]:# 一次遍历# 总结规律if head.val > 4:# 添加一位head = ListNode(0, head)cur = headwhile cur:cur.val = cur.val * 2 % 10if cur.next and cur.next.val > 4:cur.val += 1cur = cur.nextreturn head

(5)一次遍历2

来自题解(. - 力扣(LeetCode))。和(4)的解法道理是一样的,都是根据数值的范围确定只能进位一次。(4)是从上节点的角度,而(5)是从下节点的角度。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def doubleIt(self, head: Optional[ListNode]) -> Optional[ListNode]:# 一次遍历2dummy = ListNode(next = head)pre = dummycur = headwhile cur:newVal = cur.val * 2pre.val += newVal // 10cur.val = newVal % 10pre = curcur = cur.nextreturn dummy if dummy.val else dummy.next

感谢你看到这里!一起加油吧!

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

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

相关文章

一个可以自动生成随机区组试验的excel VBA小程序2

本程序用于应对随机区组试验中要求相同小区位置不能出现同一品种的情况。编程思路略有不同,故将另开一篇。 本试验设计是在原来的基础上改版的,相关的参数设置与操作同上一版,这里不在赘述:一个可以自动生成随机区组试验的excel V…

【Linux操作系统】Linux中进程的五种状态:R、S、D、T、X以及僵尸进程、孤儿进程

操作系统中有许多同时执行的进程,这些进程都可能处于不同的状态代表着不同的含义。 R运行状态(running) 概念:并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 我们运行可执行程序myproc利用指令 ps ajx可以看到进程…

微信小程序使用bindtap事件data-xxx传值无法获取

文章目录 1.实例代码2.原因分析3.解决办法 1.实例代码 index.wxml <view data-hi"数据1" bindtap"menuTouch"><image mode"aspectFit" src"{{item.src}}"></image><text class"menu-item-text">{{…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

Java运算符介绍及其用法

运算符 1.算数运算符 符号说明加法-减法*乘法/除法如果符号前后都是整数,结果取整数部分如果符号前后有一个为小数,结果就是正常小数%模,取余数部分 public class Demo01Arithmetic {public static void main(String[] args) {int i 10;int j 3;int add ij;//推荐使用Sys…

问题:在本案复议阶段,复议机关()。 #其他#媒体

问题&#xff1a;在本案复议阶段&#xff0c;复议机关&#xff08;&#xff09;。 A&#xff0e;有权责令被申请人纠正违法的征税行为 B&#xff0e;应当对被申请人作出的税务具体行政行为所依据的事实证据、法律程序、法律依据及设定权利义务内容的合法性、适当性进行全面审…

【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】

文章目录 前言一、获取所有学院信息接口执行二、线程组的介绍 2.1 并发和顺序执行 2.2 优先和最后执行线程组 2.3 线程组的设置细节三、HTTP请求的介绍四、查看结果树的配置使用总结 前言 一、获取所有学院信息接口执行 我们先针对一条简单的接口进行执行&#…

sql server 把表的所有的null改为0,不要限制某列

DECLARE tableName NVARCHAR(256) Linear -- 替换为你的表名 DECLARE sql NVARCHAR(MAX) SELECT sql UPDATE tableName SET COLUMN_NAME 0 WHERE COLUMN_NAME IS NULL; FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME tableName AND TABLE_SCHEM…

docker_如何推送镜像到仓库(hub.docker.com)

在执行 docker push 时收到 denied: requested access to the resource is denied 错误通常意味着你没有权限将镜像推送到目标存储库。这可能有几个原因,包括: 未登录 Docker Hub:你还没有登录到 Docker Hub,或者你登录的账户没有权限推送到目标存储库。存储库不存在:目标…

【Spring Cloud Alibaba】13.自建存储对象服务与集成(minio版)

文章目录 简介什么是云存储服务&#xff08;OSS&#xff09;为什么选择MiniIOMiniIO相关地址 搭建(docker)安装Docker部署MinIO创建存储桶配置存储桶设置存储桶可以直接在浏览器访问 集成到Spring Cloud Alibaba项目创建子模块引入依赖包项目结构配置文件工具类接口类测试 简介…

别让你的品牌失去声音,品牌策划如何成为你的王牌?

品牌策划可不仅仅是一个简单的概念&#xff0c;它是一门真正的艺术和科学。 它涉及到在确立品牌定位之后&#xff0c;进行一系列精心设计的传播和推广活动&#xff0c;从而塑造和管理品牌&#xff0c;让品牌价值达到最大化。 在这个竞争激烈的市场中&#xff0c;想要让你的品…

频谱 搬移

为什么一个信号与一个频率固定的余弦信号相乘&#xff0c;频域上&#xff0c;相当于对信号的频谱进行了一个移动处理? 这个现象可以通过傅里叶变换和调制定理来解释。 数学解释 设信号 x ( t ) x(t) x(t) 和余弦信号 cos ⁡ ( 2 π f c t ) \cos(2\pi f_c t) cos(2πfc​t)…

什么是 Spring Boot 的起步依赖和自动配置?它们的作用是什么?

Spring Boot 的起步依赖和自动配置是 Spring Boot 框架的两个核心特性&#xff0c;它们的作用主要是简化了 Spring Boot 项目的搭建和配置过程。 起步依赖&#xff08;Starter Dependencies&#xff09;&#xff1a;起步依赖是一种预先定义好的依赖关系集合&#xff0c;它包含…

【人工智能】第三部分:ChatGPT的应用场景和挑战

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

docker搭建mongo单机单节点副本集模式

1.先说问题 现有如下问题: 1.在springboot环境下,连接mongo,报如下错误: Caused by: com.mongodb.MongoCommandException: Command failed with error 20 (IllegalOperation): Transaction numbers are only allowed on a replica set member or mongos on server xxx:…

FactoryTalk View Site Edition的VBA基本应用

第一节 在VBA中标签的读取和写入 本例要达到的目标是通过FactoryTalk View Site Edition&#xff08;以下简称SE&#xff09;的VBA来访问PLC中的下位标签&#xff0c;并实现标签的读写。 1.准备工作 打开SE&#xff0c;选择应用程序类型&#xff08;本例是Site Edition Netwo…

解决Ubuntu系统/usr/lib/xorg/Xorg占用显卡内存问题原创

在Ubuntu系统中&#xff0c;/usr/lib/xorg/Xorg进程占用显卡内存的问题可能会影响系统性能&#xff0c;特别是在使用GPU进行计算任务时。以下是一些解决方法&#xff0c;可以帮助你减少或解决这个问题&#xff1a; 1. 更新显卡驱动 首先&#xff0c;确保你使用的是最新版本的…

【C++面向对象编程】(二)this指针和静态成员

文章目录 this指针和静态成员this指针静态成员 this指针和静态成员 this指针 C中类的成员变量和成员函数的存储方式有所不同&#xff1a; 成员变量&#xff1a;对象的成员变量直接作为对象的一部分存储在内存中。成员函数&#xff1a;成员函数&#xff08;非静态成员函数&am…

燃烧截稿倒计时,NDSS‘25大会即将召开,你的论文准备好了吗?

燃烧截稿倒计时&#xff01;NDSS25大会即将召开&#xff0c;你的论文准备好了吗&#xff1f; 第32届NDSS25(Network and Distributed System Security Symposium)即网络与分布式系统安全研讨会将于2025年2月23日至28日在加利福尼亚州圣地亚哥举行&#xff01; 作为信息安全领域…

【Python机器学习】将PCA用于cancer数据集并可视化

PCA最常见的应用之一就是将高维数据集可视化。一般对于有两个以上特征的数据&#xff0c;很难绘制散点图&#xff0c;。对于Iris&#xff08;鸢尾花&#xff09;数据集&#xff0c;我们可以创建散点矩阵图&#xff0c;通过展示特征所有可能的两两组合来展示数据的局部图像。 不…