題一:鍊錶分化
/**
* 題幹:
* 對於乙個鍊錶,我們需要用乙個特定閾值完成對它的分化,使得小於等於這個值的結點移到前面,大於該值的結點在後面,同時保證兩類結點內部的位置關係不變。
* 給定乙個鍊錶的頭結點head,同時給定閾值val,請返回乙個鍊錶,使小於等於它的結點在前,大於等於它的在後,保證結點值不重複。
* 測試樣例:
* ,3
* *
* 解析:這是乙個經典的荷蘭過期問題,只是在這裡要求在鍊錶中完成;通過維護三個鍊錶來完成,具體如下
* 小於鍊錶、等於鍊錶、大於鍊錶
* 在維護的時候需要通過指標記錄小於鍊錶的尾部,需要通過指標記錄等於鍊錶的頭部和尾部,需要通過指標記錄大於鍊錶的頭部。
* 最後就可以通過以上的四個指標將三個鍊錶連在一起。
* *
*/ class solution
}
題二:列印兩個公升序鍊錶的公共值
/**
* 題幹:
* 現有兩個公升序鍊錶,且鍊錶中均無重複元素。請設計乙個高效的演算法,列印兩個鍊錶的公共值部分。
* 給定兩個鍊錶的頭指標heada和headb,請返回乙個vector,元素為兩個鍊錶的公共部分。請保證返回陣列的公升序。兩個鍊錶的元素個數均小於等於500。保證一定有公共值
* 測試樣例:
* ,* 返回:[2.4.6]
* * 解析:因為鍊錶是有序的所以很簡單,假設鍊錶a,b。
* 首先從鏈頭開始比較兩個鍊錶,如果a 的當前元素等於b的當前元素,那就列印他們的當前元素,並且a、b同時指向他們的下乙個元素,
* 如果a、b的當前元素關係不是等於,那麼就將較小的一方指標向前指一位,一直到找到相等的或者他們的大小關係反過來,迴圈此操作直到其中乙個鍊錶走完
* *
* */
class solution
listlist = new arraylist<>();
while (heada != null && headb != null) else
if (heada.val < headb.val) else
}int result = new
int[list.size()];
int i = 0;
for (int j = 0; j < list.size(); j++)
return result;}}
public
class
listnode
}
題四:如何證明乙個鍊錶裡面有環,並且返回第乙個入環的節點。可以利用快慢指標來解決。
用乙個快慢指標,快指標每次走兩個節點,慢指標每次走乙個節點,如果快慢指標能夠相遇那麼就代表存在環,接下來將慢指標指向頭結點。重新開始往前走還是每次走一步,快指標也是同時開始往前走,但是這次一次走乙個節點,他們下一次相遇的地方就是入環的第乙個節點。
如果不存在環,那麼在第一次快慢指標走的時候肯定是快指標走到null值他們也沒有相遇。
具體證明如下:
題五:
證明兩個單鏈表是否相交,如果相交請返回他們相交的第乙個節點。
分析對於單鏈表如果他們相交那麼相交節點以後的節點肯定 都是兩個鍊錶的共同節點。而且對於有環節點和無環節點還需分不同情況討論。
即:1.2.3三種狀況
對於途中1.2他們都是屬於一種情況就是在入環節點以前就相交。
所以這道題的關鍵就在於討論是否存在環;
(1)如果不存在環,直接先遍歷一遍兩個節點,得出兩個節點長度的差值,然後較長的節點再從頭結點開始遍歷差值個節點(剩下未遍歷部分的節點數一樣),然後兩個鍊錶同時向下遍歷,如果在尾節點之前他們存在相等的節點那麼存在相交。反之。
(2)如果不存在環,先分別找出入環節點(如果入環節點一樣那麼一定是情況1)然後再分別遍歷兩節點,一直遍歷到兩節點的入環節點統計出這段的長度。然後再去執行(1)找出在他們入環之前的相交節點。
如果存在環而且經過(2)以後仍然沒有搜尋到相交的節點那麼只有情況3能滿足了,要滿足情況三,就選取其中乙個入環節點向下遍歷,而且一定能夠遍歷到另乙個入環節點。如果能則他們兩個入環節點中的任意乙個都是他們的首次相交節點。
直通BAT面試演算法精講 鍊錶(1)
鍊錶問題知識點和注意事項 1.鍊錶問題演算法難度不高,但考察 實現能力。2.鍊錶和陣列都是一種線性結構,陣列是一段連續的儲存空間,鍊錶空間不一定保證連續,是臨時分配的 鍊錶問題 實現關鍵點 1.鍊錶調整函式的返回值,型別要求往往是節點型別。2.處理鍊錶過程中,先採用畫圖的方式理清邏輯。3.鍊錶問題對...
直通BAT面試演算法精講課2
對於乙個int陣列,請編寫乙個氣泡排序演算法,對陣列元素排序。給定乙個int陣列a及陣列的大小n,請返回排序後的陣列。測試樣例 1,2,3,5,2,3 6 1,2,2,3,3,5 冒泡 依次比較相鄰,大的放後面。class bubblesort return a class bubblesort r...
直通BAT面試演算法精講課1
1.有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。struct treenode class treeprinter ...