快慢指针法。
定义两个指针:慢指针每次走一步快指针每次走两步。依次循环下去,如果链表存在环,那么快慢指针一定会有相等的时候。
为了便于理解,你可以想象在操场跑步的两个人,一个快一个慢,那么他们一定会相遇(无论他们的起始点是不是在操场)。
【题141】
题目描述
判断一个链表序列是否存在环。
代码
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
【题142】
判断是否有环路,如果有的话,返回环路的起点。
思路:当slow和fast相遇时,将slow的指针修改为head,fast不变,两者的步调一致。则下一次相遇的位置就是环路的起点。
代码
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next == None:
return None
faster = slow = head
while faster and faster.next:
faster = faster.next.next
slow = slow.next
if faster == slow:
break
if slow == faster:
slow = head
while slow != faster:
slow = slow.next
faster = faster.next
return slow
return None
---------------------
作者:风澈云间
来源:CSDN
原文:https://blog.csdn.net/qian2729/article/details/50599772
版权声明:本文为博主原创文章,转载请附上博文链接!