先注声明:解题思路:借鉴、归纳及总结 意在记录学习过程(非原创)
但文字部分及所用图片均来自个人 谢绝转载
1.交换链表 LeetCode 24 24. 两两交换链表中的节点 - 力扣(Leetcode)
迭代法:
递归法:
联想: 虽然记叙了两种解法,但本质上只是一种。并且在这道题里,递归并不比迭代高明多少。
记叙两个版本的代码,或许也只是想说明一件事:迭代和递归本来就是一致的。
或许迭代是一种正向思考,从起点开始;而递归往往是反向思维,从终点开始。
但无论是哪一种,初态,末态以及循环间的一次操作都是需要思考清楚的。
2.链表里的双指针法
阐释: 由于单向链表里查找元素只能从头往后顺,并且操作某个结点时必须已知前鉴结点。
所以两个以上的指针操作是常见的。比较普遍的是pre、cur、temp的表示。
当然双指针法也不是表面的意义——指包含两个指针所有操作。
更多情况下,它可能作为一种降低时间复杂度的工具。
特在此记叙链表里较为经典的几种双指针应用,希望常温常新。
典例1:LeetCode 19 19. 删除链表的倒数第 N 个结点 - 力扣(Leetcode)
标签:等间距移动
典例2: LeetCode 142 142. 环形链表 II - 力扣(Leetcode)
标签:判断链表是否有环 + 确定环的入口
备注:用快慢指针判断是否有环是比较常规的,但是用数学计算环入口确实没想到。
不过与其说是数学问题,不如说是物理问题。
预设fast速度为2,slow速度为1,则 fast 和slow 的相对速度恰与slow的绝对速度相同。
而fast和slow又同时出发,这说明二者的相对位移和slow的绝对位移相等。
因此减去公共部分,可以推算出相遇点和初始点距环入口处的距离相等。
wow, 真是绝妙的结论。
典例3: LeetCode 面试题02.07 面试题 02.07. 链表相交 - 力扣(Leetcode)
LeetCode 160 160. 相交链表 - 力扣(Leetcode)
标签:消除长度差后的同步比较
暴力破解:(复杂度较高)
双指针法1:(时间复杂度:O(n + m))
思路:相交的公共部分不会造成长度差,且产生在(相对位置的)中后段,
所以可以砍掉较长的链表头部,即长链表的指针先行差值,
当两条链表长度相同时再逐次比较。
双指针法2:(时间复杂度:O(n + m))
备注:这是比较 “浪漫” 的解法:通过互走链表来消除长度差,但是确实很难想到。