タイトル説明
リング含む場合、エントリのリングノードリストを見つける前記リンクされたリストに、そうでなければ、NULLを出力します。
思考
- 訪問したベクトルノードの確立保存、前各反復ベクトルに同じノードが返された場合は、新しいノードに押され、そうでない場合は、その後、プッシュ
- 環が存在する場合、各ポインタはすぐ2つのステップを取る、リストの先頭から開始し、ポインタ遅い工程速度を設定しているポインタは、リングは、点(結論1)で満たさなければなりません。次に、2つのポインタがミーティングポイントからのものであり、各時間ステップに置き換えられどちらもリストの先頭は、リングは、最終的にインレット(結論2)を発生してみましょう。
コード
この方法の一つ:
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;
}
};
方法2:
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;
}
};