先弄清楚数学问题:

  • 将有环的链表抽象为下图,且设在第一次相遇的点为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)
  • 在让一个指针从起始位置出发,一个指针从相遇点出发,若有环则可以相遇。

alt

```# 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