前往此题

预备知识

链表基础知识

题解

双指针法

slow代表慢指针,它是一步一步走的
fast代表快指针,它是二步二步走的

终止条件

如果slowfast最终撞在一起了,说明是环形链表。这个应该很好理解吧,相当于是两个人跑步,一个跑的快一个跑的慢,如果是跑直线那么他们两个绝对不会碰撞。如果是跑圈,那迟早会相遇的。如果快指针跑完全程了则说明不是环形链表fast==null或者fast.next==null

代码

# 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:
        if not head or not head.next: return False

        slow, fast = head, head.next
        while slow != fast:
            if not fast or not fast.next: return False
            slow = slow.next
            fast = fast.next.next
        return True

哈希表法

哈希表法是最简单粗暴的,直接遍历整个链表,将每个节点存入哈希表中,如果遇到某个节点以及存在于表中就说明是环形链表了。重复这一过程直到我们遍历完整个链表为止。

代码

# 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:
        hashs = set()
        while head:
            if head in hashs:
                return True
            hashs.add(head)
            head = head.next
        return False