142 環形鍊錶 II

2021-09-10 03:53:09 字數 1425 閱讀 2282

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

說明:不允許修改給定的鍊錶。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:tail connects to node index 1

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0

輸出:tail connects to node index 0

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

return true;

} public:

listnode *detectcycle(listnode *head)

return head;//這句還是加一下,不然有的編譯器會報錯此函式沒有返回。

} };

思路二:floyd 演算法

如果快慢指標都從head出發,假設在h點相遇,設快指標走的路徑為g,慢指標路徑走的路徑為s

g=f+a+b+a;

s=f+a;

相遇則有

g=2s

f+a+b+a=2f+2a

所以有f=b

所以只需記錄相遇點,然後在讓乙個指標和相遇點的指標同時移動,他們則會相遇在入口

listnode* solution::detectcycle(listnode * head)

slow=slow->next;

fast=fast->next;

if(nullptr==fast)

return nullptr;

fast=fast->next;

} if(nullptr==fast) return nullptr; /* 沒環返回nullptr */

while(restart!=interaction)

return restart;

}

142 環形鍊錶 II

還是快慢指標的問題,當發現有環時,將fast指向head,fast一次向前移動乙個節點,則fast和slow一定會在環的入口相遇.證明 設s為slow指標走的節點個數,m為環的入口距head的位置 則第一次相遇時,fast和head相對於環入口的位置相同,fast在環中的相對於環入口的位置在 2s ...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.struct listnode class solution node set.insert...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...