解法一:
直接用一个集合或list一遍把链表装进去,一边检查元素是否存在。
用集合:
class Solution:
def hasCycle(self, head: ListNode) -> bool:
seen=set()
while head:
if head in seen:
return True
seen.add(head)
head=head.next
return False
用list:
class Solution:
def hasCycle(self, head: ListNode) -> bool:
seen = []
while head:
if head in seen:
return True
seen.append(head)
head = head.next
return False #循环结束,说明走到链表末尾
用list的时间复杂度会高很多
解法二:快慢指针
快指针会饶环,与慢指针相遇。循环条件为两指针不一致,所以初始时,一个为head,一个为head.next
。终止条件是快指针遇到慢指针,或是快指针走到链表结束。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head or not head.next:
return False
slow=head
fast=head.next
while fast!=slow:
if not fast or not fast.next:
return False
slow=slow.next
fast=fast.next.next
return True
Error:没对空链表进行处理