题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null
思路:先通过快慢指针法判断链表是否存在环,此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),这次两个指针一次走一步,相遇的地方就是入口节点。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
#链表为空或者长度为1时,返回无环存在
if not pHead or not pHead.next:
return None
fastNode = pHead
slowNode = pHead
while fastNode.next and fastNode.next.next:
# 定义一个快指针,一个慢指针
# 只要游标一快一慢,终会相遇
# 只要两个游标不为空就一直循环
slowNode = slowNode.next
fastNode = fastNode.next.next
#快慢游标相遇就证明有环存在
if slowNode.val == fastNode.val:
#跳出循环找环结点入口
break
#此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),
#这次两个指针一次走一步,相遇的地方就是入口节点。
while pHead:
if pHead.val == fastNode.val:
return pHead
pHead = pHead.next
fastNode = fastNode.next
#无环返回null
return null