雙指標
二、左右指標的常用演算法
鏈結
利用快慢指標
最開始slow與fast指標都指向鍊錶第乙個節點,
前者解決主要解決鍊錶中的問題,
listnode detectcycle
(listnode head)
slow = head;
while
(slow != fast)
return slow;
}
設相遇點距環的起點的距離為m,
只要我們把快慢指標中的任乙個重新指向 head,然後兩個指標同速前進,k - m 步後就會相遇,相遇之處就是環的起點了。
// slow 就在中間位置
return slow;
回想陣列的歸併排序:求中點索引遞迴地把陣列二分,最後合併兩個有序陣列。對於鍊錶,合併兩個有序鍊錶是很簡單的,難點就在於二分。
但是現在你學會了找到鍊錶的中點,就能實現鍊錶的二分了。關於歸併排序的具體內容本文就不具體展開了。
listnode slow, fast;
slow = fast = head;
while (k-- > 0)
fast = fast.next;
while (fast != null)
return slow;
前文 二分查詢演算法詳解 有詳細講解,這裡只寫最簡單的二分演算法,旨在突出它的雙指標特性:
int binarysearch(int nums, int target)
}直接看一道 leetcode 題目吧:
只要陣列有序,就應該想到雙指標技巧。這道題的解法有點類似二分查詢,通過調節 left 和 right 可以調整 sum 的大小:
void reverse(int nums)
}這也許是雙指標技巧的最高境界了,如果掌握了此演算法,可以解決一大類子字串匹配的問題,不過「滑動視窗」演算法比上述的這些演算法稍微複雜些。
雙指標中的快慢指標
快慢指標是個好東西,經常用在陣列和鍊錶中。小強比小明跑得快,他倆在同乙個環形跑道 同乙個起點開始跑步,只要時間足夠,小強就會超小明一圈追上小明。小強就是快指標,小明就是慢指標。那麼快慢指標有什麼用呢?試想一下,如果跑道不是環形而是直線,那小強永遠不會再和小明相遇。所以常見快慢指標用於檢測鍊錶中是否存...
專題 鍊錶雙指標問題(快慢指標 相遇指標)
雙指標 分別指向兩個鍊錶,每個鍊錶各自乙個指標 快慢指標 指向同乙個鍊錶,一前一後,前進速度不同 相遇指標 指向同乙個有環鏈表,一前一後,前進速度不同 面試題22.鍊錶中倒數第k個節點 definition for singly linked list.public class listnode c...
雙指標(快慢指標)判斷鍊錶是否有環
單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...