Titre description
Pour une liste liée, dans lequel si le cycle comprend, de trouver la liste de noeuds d'anneau d'entrée, sinon, null sorties.
pensée
- Enregistrer la mise en place d'un noeud vecteur visité, avant chaque vecteur d'itération enfoncé dans le nouveau noeud, se trouve le même nœud est retourné, sinon, poussé
- vitesse réglage pointeur, à partir de la tête de la liste sont, chaque pointeur de prendre rapidement en deux étapes, une étape lente de pointeur, s'il y a un anneau, l'anneau doit répondre à un point (Conclusion 1). Ensuite, laissez les deux pointeurs sont du point de rencontre et la tête de la liste, tous deux sont remplacés chaque pas de temps, l'anneau éventuellement rencontrer une entrée (Conclusion 2).
code
Première méthode:
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éthode Deux:
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;
}
};