中難易度837
リンクリストを指定して、リンクリストがリングに入り始める最初のノードを返します。リンクリストにリングがない場合は、を返します
null
。特定のリンクリスト内のリングを表すために、整数を使用して
pos
、リンクリストの終わりがリンクリストに接続されている位置を示します(インデックスは0から始まります)。それは場合pos
で-1
、リンクされたリストにはリングがありません。ことに注意してくださいpos
、唯一のリングを識別するために使用され、パラメータとして関数に渡されることはありません。注:指定されたリンクリストを変更することは許可されていません。
上級:
O(1)
この問題を解決するためにスペースを使用できます か?
例1:
入力: head = [3,2,0、-4]、POS = 1 出力:インデックスリストを返しますノード1の 説明:リストには、2番目のノードに接続されたリングテール部分があります。例2:
入力: head = [1,2]、POS = 0 出力:インデックスリストを返しますノード0の 説明:リストには最初のノードのテールに接続されたリングがあります。例3:
入力: head = [1]、pos = -1 出力: nullを返します 説明:リンクリストにリングがありません。
促す:
- リスト内のノードの数は
[0, 104]
、-105 <= Node.val <= 105
pos
の値-1
またはリンクリスト内の有効なインデックス
1.ハッシュテーブル
訪問したノードをセットに格納します。ノードがすでに存在する場合、それはリングのエントリです。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_set<ListNode*> ust;
while(head != NULL){
if(ust.count(head)){
return head;
}
ust.insert(head);
head = head->next;
}
return NULL;
}
};
2.ダブルポインター-高速ポインターと低速ポインター
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* slow = head, *fast = head;
while(fast != NULL){
slow = slow->next;
if(fast->next == NULL){
return NULL;
}
fast = fast->next->next;
if(slow == fast){
ListNode* ptr = head;
while(ptr != slow){
ptr = ptr->next;
slow = slow->next;
}
return ptr;
}
}
return NULL;
}
};