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 ...