先弄清楚数学问题:
- 将有环的链表抽象为下图,且设在第一次相遇的点为m,没进入环之前的路径为a、进入环之后到m的路径为b,环最后部分的路径为c: 首先定义快慢指针、fast、slow,fast每次走两步、slow每次走一步。
- 在第一次相遇时有数学表达式:先看slow=a+b,fast=a+b+N(b+c),之前看别人题解也不太明白,于是自己假设,fast转了两圈则有 a+b+c+b+c+b=a+b+2(b+c),于是可以归纳处fast=a+b+N(b+c)
- 又有fast=2slow,则有2(a+b)=a+b+N(b+c),于是a+b=N(b+c)
- 在让一个指针从起始位置出发,一个指针从相遇点出发,若有环则可以相遇。
```# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param head ListNode类
# @return bool布尔型
#
class Solution:
def hasCycle(self , head: ListNode) -> bool:
fast=head
slow=head
while fast!=None and fast.next!=None:
fast = fast.next.next
slow = slow.next
if fast==slow:
while head!=slow:
head=head.next
slow = slow.next
return True
return False