预备知识
链表基础知识
题解
双指针法
slow代表慢指针,它是一步一步走的
fast代表快指针,它是二步二步走的
终止条件
如果slow
和 fast
最终撞在一起了,说明是环形链表。这个应该很好理解吧,相当于是两个人跑步,一个跑的快一个跑的慢,如果是跑直线那么他们两个绝对不会碰撞。如果是跑圈,那迟早会相遇的。如果快指针跑完全程了则说明不是环形链表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