título Descripción
Para una lista enlazada, en donde si los comprende el anillo, encontrar la lista de nodos anillo de entrada, de lo contrario, null salidas.
Requisitos: la complejidad espacial es O (1)
pensamiento
Con dos punteros, el puntero se mueve rápidamente dos veces, una vez para ir a un puntero paso lento. Si hay un anillo, que se reunirá
Después del encuentro, puede ser fijado por un puntero, el puntero se mueve a otra para obtener una longitud de bucle n
A continuación, los dos punteros apuntan a la cabeza, van puntero n pasos rápidos, y el puntero paseo continuación lento. Dos punteros son un paso, donde se reunirá en el ring para comenzar.
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
import collections
class Solution:
def EntryNodeOfLoop(self, pHead):
if not pHead:
return None
slow = pHead.next
fast = pHead.next
if fast:
fast = fast.next
else:
return None
while slow and fast:
if slow != fast:
slow = slow.next
fast = fast.next
if fast:
fast = fast.next
else:
return None
else:
break
if fast and slow:
# 找到圈的长度
n = 1
slow = slow.next
while slow!=fast:
slow = slow.next
n += 1
slow = pHead
fast = pHead
for i in range(n-1):
fast = fast.next
while fast != slow:
slow = slow.next
fast = fast.next
return fast
else:
return None