título Descrição
Para uma lista ligada, em que se compreende o anel, encontrar o nó lista anel de entrada, de outro modo, nulo saídas.
pensamento
- Salvar o estabelecimento de um nó vector visitado, antes de cada vector iteração pressionado no novo nó, se for encontrado o mesmo nó é retornado, se não, em seguida, empurrou
- definir a velocidade, a partir da cabeça da lista de ponteiro são, cada ponteiro rapidamente tomar dois passos, um passo lento ponteiro, se houver um anel, o anel deve encontrar-se num ponto (Conclusão 1). Em seguida, deixar que os dois ponteiros são do ponto de encontro e a cabeça da lista, ambos os quais são substituídos cada intervalo de tempo, o anel, eventualmente, encontrar uma entrada (Conclusão 2).
código
Método um:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
vector<ListNode*> v;
if(pHead == NULL)
return NULL;
v.push_back(pHead);
pHead = pHead->next;
while(pHead != NULL)
{
for(int i = 0; i < v.size();i++)
{
if(pHead == v[i])
return pHead;
}
v.push_back(pHead);
pHead = pHead->next;
}
return NULL;
}
};
Método dois:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode*fast=pHead,*low=pHead;
while(fast&&fast->next){
fast=fast->next->next;
low=low->next;
if(fast==low)
break;
}
if(!fast||!fast->next)return NULL;
low=pHead;//low从链表头出发
while(fast!=low){//fast从相遇点出发
fast=fast->next;
low=low->next;
}
return low;
}
};