面試題之 鍊錶是否有環

2021-10-10 01:37:53 字數 3296 閱讀 1888

leetcode面試題

以上面這個鍊錶為例,鍊錶**現了環路,但是如何檢測出該鍊錶是否含有環路呢?

使用兩個指標,乙個快指標和乙個慢指標,使用快指標追趕慢指標,當兩個指標相遇,那麼證明該鍊錶中存在環路。

/**

* 追趕理論:當兩個人在乙個環形跑道上跑步時,只要其中乙個人的速度比另乙個人的速度快,

* 那麼只要給足夠多的時間。該速度快的人一定能追上那個速度慢的人。

* 思路:

* 使用兩個指標,乙個慢指標,一次移動一格,

* 一格快指標,一次移動兩格,最終會追趕上

** @param root

* @return

*/public

boolean

iscycle

(listnode root)

}return

false

;}

當兩個人在足球場跑步比賽時,乙個人速度快(a),乙個人速度慢(b),同時出發,當他a追上b時停止跑步,只要給足夠的時間,a一定可以和b在某處相遇,應為足球場時乙個環形。

所以,借鑑以上思路,當快慢指標相遇之後,讓他們繼續走,每走一步環的長度加1,當快慢指標再次相遇時,就表示環的長度。

/**

* 思路:

* 當兩個指標相遇之後,他們繼續跑,因為快指標比慢指標快一倍,即

* 快指標一次移動兩格。慢指標一次移動一格。那麼從同乙個起點開始跑時,

* 他們最終會相遇,此時快指標比滿指標多跑了一圈。只要計算慢指標所跑的

* 路程就可以知道環的長度

當快指標和慢指標相遇之後,讓其繼續前進,當他們在相遇時:

假設從鍊錶的頭結點到環的頭結點的距離是d,環的頭結點到快慢指標相遇後的節點處的距離是s1,相遇節點繼續前進到環的頭結點處的距離是s2。那麼有以下數學等式:

那麼計算之後就有d=s2,將快指標移動到煉表頭結點處,然後移動快慢指標,當兩個指標重合時,表示當前節點時環路的頭結點。

/**

* 獲得環的頭結點

* 思路:

* 假設從鍊錶的頭結點到環頭結點的距離為d,環頭結點到p1和p2首次相遇的節點處的

* 距離為s1,抽次相遇的節點到頭結點的另一半的距離為s2,

* 由於:

* - p1指標一次走一步

* - p2指標一次走兩步

* 所以在p1和p2相遇時,兩個指標走過的路程如下:

* p1 = d + s1

* p2 = d + s1 + s1 + s2

* 由於p2比p1快一倍,所以p2所走的路程是p1走的路程的兩倍

* 即: 2(d+s1)=d+2*s1+s2 => 2*d + 2*s2 = d+ 2*s1 + s2 => d=s2

* 此時:將p1指標放回到頭指標,然後讓p1和p2以相同的步長前進,最終當p1和p2相等時,

* 便是停留在環的頭結點上

** @param root

* @return

*/public listnode getstartcycle

(listnode root)

if(p1 != p2)

p1 = root;

while

(p1 != p2 && p1 != null && p2 != null)

return p2;

}

import utils.listnode;

/** * 判斷鍊錶是否有環

*/public

class

iscycle

}return

false;}

/** * 思路:

* 當兩個指標相遇之後,他們繼續繼續跑,因為快指標比慢指標快一倍,即

* 快指標一次移動兩格。慢指標一次移動一格。那麼從同乙個起點開始跑時,

* 他們最終會相遇,此時快指標比滿指標多跑了一圈。只要計算慢指標所跑的

* 路程就可以知道環的長度

** @param root

* @return

*/public

inthowcyclelong

(listnode root)

}return cyclelong;

}/**

* 獲得環的頭結點

* 思路:

* 假設從鍊錶的頭結點到環頭結點的距離為d,環頭結點到p1和p2首次相遇的節點處的

* 距離為s1,抽次相遇的節點到頭結點的另一半的距離為s2,

* 由於:

* - p1指標一次走一步

* - p2指標一次走兩步

* 所以在p1和p2相遇時,兩個指標走過的路程如下:

* p1 = d + s1

* p2 = d + s1 + s1 + s2

* 由於p2比p1快一倍,所以p2所走的路程是p1走的路程的兩倍

* 即: 2(d+s1)=d+2*s1+s2 => 2*d + 2*s2 = d+ 2*s1 + s2 => d=s2

* 此時:將p1指標放回到頭指標,然後讓p1和p2以相同的步長前進,最終當p1和p2相等時,

* 便是停留在環的頭結點上

騰訊面試題 判斷鍊錶是否有環

目錄前言 1.快慢指標 2.雜湊表法 參考資料點這裡。用兩個指標指向煉表頭,每次迴圈,快指標往前兩步,慢指標往前一步 在迴圈過程中,如果快指標等於慢指標 相遇 則表示鍊錶有環 否則不存在環。如下 public boolean findbeginloop listnode head return fa...

華為面試題 怎麼判斷鍊錶中是否有環?????

定義兩個指標,一前一後,同時移動,前面的移動比後面的慢,如果是迴圈的則後面的肯定會追上前面的 思路就是弄兩個指標,開始指向不同的鍊錶不同的位置,然後1個指標移動間隔是1,乙個指標移動間隔是2,如果快的能追上慢的,那說明就有環了。就如何兩個人繞圈跑步,速度不一樣,如果速度快的能追上慢的,那說明跑道是環...

演算法面試題 如何判斷鍊錶有環

有乙個單向鍊錶,鏈中可能有 環 如何用程式判斷呢?方法1 最低效 最常想到的是 首先從頭結點開始遍歷整個鍊錶,每遍歷乙個,就和之前遍歷過的比較,這相當於每次遍歷了兩遍,無疑是擴大了鍊錶 遍歷 帶來的劣勢,其時間複雜度為o n 2 由於沒有額外的儲存空間,故空間複雜度為o 1 這也太低效了吧。方法2 ...