力扣(leetcode) 141. 环形链表 (普通法) (快慢指针法--图解)
原创
©著作权归作者所有:来自51CTO博客作者深度不学习的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目在这:https://leetcode-cn.com/problems/linked-list-cycle/
思路分析:
注意:本题的环判断一定要看指针是否已经出现过,即指针地址值,而不是看指针所指的值是否出现过。
法一:
所以我们建立一个列表,吧指针存进去,当发现当前遍历的指针已经在列表里了。说明有环。
完整代码
def hasCycle(self, head: ListNode) -> bool:
res = []
while head:
if head in res:
return True
else:
res.append(head)
head = head.next
当然。上述方法虽然能通过leetcode。但是空间复杂度不符合题目要求。
法二:
设置一快一慢两个指针,如果有环,则两个指针一定会在后面的某个位置重合。
快指针就像汽车。慢指针就像自行车,
看图!!
完整代码:
def hasCycle(self, head: ListNode) -> bool:
fast = head
slow = head
while fast and fast.next:# 由于快指针要移动两次,所以判断。fast.next是否为空。空则没有next属性。
fast = fast.next.next
slow = slow.next
if fast == slow:
return True