题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
方法 一
def EntryNodeOfLoop(self, pHead):
# write code here
#思路:使用快慢指针
#快指针每次走两步,慢指针每次走一步
#当两个指针相等时,可以判定此时有环
#之后,从第一次相遇的点开始,慢指针从该点开始走,快指针从链表头开始走
#两个指针再次指向同一个位置时,为环的入口点
if pHead == None:
return None
#快慢指针
fastPtr = pHead
slowPtr = pHead
#链表不为空,由于快指针需要走两步,因此先判断fastPtr.next是否为空
while fastPtr and fastPtr.next:
fastPtr = fastPtr.next.next
slowPtr = slowPtr.next
#当快慢指针相等时,表示有环
if fastPtr == slowPtr:
break
if fastPtr == None or fastPtr.next == None:
return None
#此时快指针从头开始走,慢指针从相遇的位置开始走
fastPtr = pHead
#快慢指针相遇时,为入口结点
while fastPtr != slowPtr:
fastPtr = fastPtr.next
slowPtr = slowPtr.next
return fastPtr
方法二
'''思路:
使用列表,每个节点都添加到列表中
当出现重复添加时,表示有环,返回重复的结点
'''
li = []
p = pHead
while p:
if p in li:
return p
else:
li.append(p)
p = p.next