题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
1、列表结构算法
class Solution:
def EntryNodeOfLoop(self, pHead):
tempList = []
p = pHead
while p:
if p in tempList:
return p
else:
tempList.append(p)
p = p.next
2、快慢指针算法
class Solution:
def EntryNodeOfLoop(self, pHead):
# 如果slow走了l的长度,那么fast就走了2l的长度
# 假设从开始到入口点的长度是s,slow在环里走的长度是d
# 那么l=s+d
# 假设环内slow没走的长度是m,那么m+d就位环的长度
# fast的长度是 n*(m+d)+d+s=2l
# 带入n*(m+d)+d+s=(s+d)*2
# s=m+(n-1)(m+d)
fastPointer = pHead.next
if not fastPointer:
return None
fastPointer = fastPointer.next
slowPointer = pHead.next
while fastPointer != slowPointer:
fastPointer = fastPointer.next
if not fastPointer:
return None
fastPointer = fastPointer.next
slowPointer = slowPointer.next
fastPointer = pHead
while fastPointer != slowPointer:
fastPointer = fastPointer.next
slowPointer = slowPointer.next
return fastPointer
时间复杂度为O(n)