题解:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
fast = slow = head
while fast != None and fast.next != None:
fast = fast.next.next
slow = slow.next
if fast == slow:
return True
return False
解题思路:这一题可能出现两种情况,即链表有环和无环,可以采用双指针法。
①链表有环,如图,定义快慢指针slow和fast刚开始指向head,随后fast指针每次都比slow多走一步(slow走一步,fast走两步),链表有环就相当于是一个环形操场,fast已经跑上环形操场3位置了,slow还没上操场跑道(还在2的位置),不过没关系,只要有这个环形操场,slow迟早会上跑道在后面追上fast。跑步轨迹如下:
slow:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
fast: 1 -> 3 -> 5 -> 7 -> 3 -> 5 -> 7
②链表没有环,也就是上图8指向空指针,那么slow就永远也追不上fast。
所以,为了防止fast跑两步之后越界了,要先规定好fast指针指向的下一个节点和下下个节点都不是空指针时才进行循环,否则就跳出循环,直接返回链表没有环即可。