leecode探索チェーンテーブルリングチェーンテーブルII
5591 ワード
タイトル
チェーンテーブルが与えられ、チェーンテーブルがループを開始した最初のノードを返します.チェーンテーブルにループがない場合はnullを返します.
与えられたチェーンテーブルのループを表すために、整数posを使用してチェーンテーブルの最後にチェーンテーブルに接続された位置を表します(インデックスは0から始まります).posが-1の場合、チェーンテーブルにリングはありません.説明:指定したチェーンテーブルの変更は許可されていません.例1:
入力:head=[3,2,0,-4],pos=1出力:tail connects to node index 1解釈:チェーンテーブルにループがあり、その末尾が2番目のノードに接続されています.ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/linked-list-cycle-ii
ぶんせき
三種類の解法 ListNodeにcountベースを追加して+1にアクセスし、遭遇カウントが2の場合は2回アクセスされたことを示し、ループの開始である. 両指針法、速遅針、速針は2歩、遅針は1歩、環があれば出会う.ループが見つかった後、新しいポインタは最初から、遅いポインタは前に進み続け、図を描くと明らかに見えるはずで、二人はまた同じ点で出会う. は補助空間O(N)を借りて、1つのhashmapを採用して、訪問したのはhashmapの中に参加して、hashmapの中ですでにあったことに出会って、環に出会ったことを表明して、 解法解法2
チェーンテーブルが与えられ、チェーンテーブルがループを開始した最初のノードを返します.チェーンテーブルにループがない場合はnullを返します.
与えられたチェーンテーブルのループを表すために、整数posを使用してチェーンテーブルの最後にチェーンテーブルに接続された位置を表します(インデックスは0から始まります).posが-1の場合、チェーンテーブルにリングはありません.説明:指定したチェーンテーブルの変更は許可されていません.例1:
入力:head=[3,2,0,-4],pos=1出力:tail connects to node index 1解釈:チェーンテーブルにループがあり、その末尾が2番目のノードに接続されています.ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/linked-list-cycle-ii
ぶんせき
三種類の解法
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func detectCycle(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return nil
}
slow, fast := head, head.Next
for slow != fast {
if fast == nil || fast.Next == nil {
return nil
}
slow = slow.Next
fast = fast.Next.Next
}
// fmt.Printf("
")
// ,
// aNew 0 , slow -1
slow = slow.Next
for aNew := head; aNew != slow; aNew, slow = aNew.Next, slow.Next {
// fmt.Printf("1: %v, 2: %v
", aNew.Val, slow.Val)
}
return slow
}
unc detectCycle(head *ListNode) *ListNode {
var mm = make(map[*ListNode]bool)
cur := head
for cur != nil {
if _, ok := mm[cur]; ok {
return cur
}
mm[cur] = true
cur = cur.Next
}
return nil
}