力扣题目
解法
这类链表题目一般都是使用双指针法
解决的,
比如:
- 寻找距离尾部第K个节点
- 寻找环入口
- 寻找公共尾部入口
- …
1. 求解环形链表之快慢指针
算法流程
复杂度分析
- 时间复杂度O(N)
第二次相遇中,慢指针须走步数 a < a + b
;第一次相遇中,慢指针须走步数 a + b - x < a + b
,其中 x
为双指针重合点与环入口距离;因此总体为线性复杂度;
- 空间复杂度O(1)
双指针使用常数大小的额外空间
视频理解
参见链接:环形链表
视频很好理解~~~~
强烈推荐!
2. python 程序
class Solution(object):
def detectCycle(self, head):
fast, slow = head, head
while True:
if not (fast and fast.next): return
fast, slow = fast.next.next, slow.next
if fast == slow: break
fast = head
while fast != slow:
fast, slow = fast.next, slow.next
return fast