判斷鍊錶入環的第乙個結點

2021-10-24 14:46:30 字數 648 閱讀 7787

記錄乙個有趣的題。

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

這是很簡單有趣的演算法:首先用快慢指標來找是否存在環;接著如果有環,就是乙個小小的數學變化:首先快指標的步長是慢指標的兩倍,且兩指標相遇一定在環內。設首結點到入環的第乙個結點的距離為a,在快慢指標停在環內的結點距離入環第乙個結點為b,在環內剩餘長度為c,則有如下表示式:快指標步長 = 2 * 慢指標步長=>a + b + c + b = 2 * (a + b),解得:c = a。那麼設p = head,則p只要再走和slow或者fast一樣的步長,當他們相遇時,那個結點就是入環的第乙個結點(畫圖好理解)。

type listnode struct

func

detectcycle

(head *listnode)

*listnode

}if hascycle

return p

}return

nil}

環形鍊錶的判斷 如有環,返回入環的第乙個結點

思路 從表頭開始遍歷每乙個節點,並且存入set集合裡,一旦遇到了此前碰到過的節點,就可以判定鍊錶中存在環。definition for singly linked list.struct listnode class solution return head 使用兩個指標fast,slow,fast...

判斷鍊錶是否有環以及求環中第乙個結點

題目 給定單鏈表,如果有環的話請返回從頭結點進入環的第乙個結點。答 include stdafx.h include include include using namespace std struct listnode 構造鍊錶 void createlist listnode phead,lis...

LeetCode 返回鍊錶入環的第乙個節點

leetcode142 題目描述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點.如果鍊錶無環,則返回null.為了表示給定鍊錶中的環,我們使用整形pos來 表示鍊錶尾連線到鍊錶中的位置 索引從0開始 如果pos是 1,則在該鏈 表中沒有環.注意,pos僅僅是用於標識環的情況,並不會作為引數傳遞到函式中...