属实难到了
解决步骤:
1 判断是否有环
2 用快慢指针找到交点
3 设两个新指针分别从head和交点出发,两个新指针相等的点则是入环点
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 首先判断是否有环
# 两个指针第一次相遇,头节点到环入口的位置的距离就是环的总长度减去慢指针在环内的走过的距离
slow, fast = head, head
while fast and fast.next: # 保证ListNode元素大于1
slow, fast = slow.next, fast.next.next
# 当快慢指针相遇后,p从head节点运动,q从相遇节点运动,
# 当两者相同时,即两者都是环的初始状态时,二者相等,相等的位置也是环的初始节点
if slow == fast:
p = head
q = slow
while(p != q):
p, q = p.next, q.next
return p
else:
return None