题目:给定一个链表,判断链表中是否有环。
思路:快慢指针
有环 3→2→0→4→2 无环 3→2→0→4
p1走一步:3 2 0 4 2 0 4 p1走一步:3 2 0 4
p2走两步:3 2 0 4 2 0 4 2 0 4 2 0 4 p2走两步:3 2 0 4
看第4步会重合 而无环的则不会有这种现象
复杂度:时间复杂度 O(n) 空间复杂度 O(1)
代码:
def hasCycle(head):
# 当为空 或者 只有一个元素 且该元素的next为空
if not head or not head.next:
return False
p1, p2 = head, head
# 此处不需要判断p1 因为p1是慢指针
# 也不需要判断下一个为不为空 因为是空也可以赋值 可以放到下一轮判断
# while p1 and p1.next and p2 and p2.next and p2.next.next:
while p2 and p2.next:
p1 = p1.next
p2 = p2.next.next
if p1 == p2:
return True
return False