代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II
1.代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素2.代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II3.代码随想录算法训练营第三天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
4.代码随想录算法训练营第四天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II
5.代码随想录算法训练营第五天 | 复习和总结6.代码随想录算法训练营第六天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1.两数之和7.代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和8.代码随想录算法训练营第八天 | 344.反转字符串,541.反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串9.代码随想录算法训练营第十天 | 栈与队列理论基础,232.用栈实现队列,225.用队列实现栈10.代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值11.代码随想录算法训练营第十三天 | 239. 滑动窗口最大值,347.前 K 个高频元素12.代码随想录算法训练营第十四天 | 二叉树理论基础,递归遍历,分别迭代遍历, 统一迭代遍历13.代码随想录算法训练营第十五天 | 层序遍历 ,226.翻转二叉树,101.对称二叉树14.代码随想录算法训练营第十六天 |104.二叉树的最大深度,559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数15.代码随想录算法训练营第十八天 | 513.找树左下角的值,112. 路径总和,113.路径总和ii,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树16.代码随想录算法训练营第二十天|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树17.代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先18.代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点19.代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树,108.将有 序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树20.代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合21.代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合22.代码随想录算法训练营第二十七天 | 39. 组合总和,40.组合总和II,131.分割回文串一、24. 两两交换链表中的节点
题目链接:
学习前:
思路:
未新增虚拟结点。节点数为0,1,2需要另外讨论。当节点数>=2时,返回的head值为第2个节点,需要3个指针first、second、prev,分别是第一个节点和第二个节点,以及第一个节点的前节点。while(first非空){if(second非空)...else 结束循环}
时间复杂度:O(n)
空间复杂度:O(1)
学习后:
-
新增虚拟结点,不需要额外讨论某些节点数,均统一处理,使得逻辑清晰,代码可读性更高。核心思路是需要同时存储四个结点的信息,虚拟头结点第一个结点的前一个结点,还有第二个结点的后一结点
-
可以进一步直接优化掉第四个结点,即第四个结点为second的next,优先赋值,从后往前
二、19.删除链表的倒数第N个节点
题目链接:
学习前:
思路:
两趟遍历。第一趟,确定链表的长度;第二趟,确定倒数第n个结点的前一结点,进行删除
时间复杂度:O(n)
空间复杂度:O(1)
学习后:
快慢指针,一趟遍历。虚拟结点的序号为0,初始快慢指针均指向虚拟结点,然后快指针先指向第n个结点,接着快慢指针一起移动,直到快指针指向最后一个节点,则慢指针指向要删除结点的前序结点。
三、面试题 02.07. 链表相交
题目链接:
学习前:
思路:
无
学习后:
首先获取两个链表的长度,在更长的链表上进行移动,两个指针的位置使得两个链表右对齐。
时间复杂度:O(n+m)
空间复杂度:O(1)
四、142.环形链表II
题目链接:
学习前:
思路:
无
学习后:
- 确定有无环。用快慢指针判断是否会相遇,快指针每次走2步,慢指针每次走1步,若相遇,则有环
- 在相遇时,确定相遇的节点位置
- 从第一个节点和相遇节点同时进行移动,每次都只走一步,当相遇时,就是入环的第一个结点
五、学习总结
-
时间:4h
-
快慢指针,yyds!!!
-
引入虚拟结点,可以使得操作具有统一性,不用额外判断head为空的情况
合集:
算法刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!