2、返回環的起始位置
3、尋找鍊錶的中點
4、尋找鍊錶的倒數第 k 個元素
二、左右指標
雙指標技巧可以分為兩類:一類是【快慢指標】、一類是【左右指標】
快慢指標一般初始化指向煉表頭結點head,前進時快指標fast在前,慢指標slow在後,巧妙解決鍊錶中的一些問題。
經典解法就是用兩個指標,乙個每次前進兩步,乙個每次前進一步。如果不含有環,跑得快的那個指標最終會遇到 null,說明鍊錶不含環;如果含有環,快指標最終會超慢指標一圈,和慢指標相遇,說明鍊錶含有環。
141. 環形鍊錶
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
return false;}}
;
第一次相遇時,假設慢指標 slow 走了 k 步,那麼快指標 fast 一定走了 2k 步,也就是說比 slow 多走了 k 步(也就是環的長度)。設相遇點距環的起點的距離為 m,那麼環的起點距頭結點 head 的距離為 k - m,也就是說如果從 head 前進 k - m 步就能到達環起點。
巧的是,如果從相遇點繼續前進 k - m 步,也恰好到達環起點。
class solution }if
(hascycle)
return slow;
}else
return
null;}
};
快指標一次前進兩步,慢指標一次前進一步,當快指標到達鍊錶盡頭時,慢指標就處於鍊錶的中間位置。
876. 鍊錶的中間結點
class solution
return slow;}}
;
我們的思路還是使用快慢指標,讓快指標先走 k 步,然後快慢指標開始同速前進。這樣當快指標走到鍊錶末尾 null 時,慢指標所在的位置就是倒數第 k 個鍊錶節點.
劍指 offer 22. 鍊錶中倒數第k個節點
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
while
(fast !=
null
)return slow;}}
;
左右指標在陣列中實際是指兩個索引值,一般初始化為 left = 0, right = nums.length - 1 。
int
binaryserarch
(vector<
int>
&nums,
int target)
else
if(nums[mid]
< target)
else
}return-1
;}
如果陣列有序,就應該想到雙指標技巧。這道題的解法有點類似二分查詢,通過調節 left 和 right 可以調整 sum 的大小:
int
twosum
(vector<
int>
&nums,
int target);}
else
if(num < target)
else
}return
;}
void
reverse
(int
nums)
}
也許是雙指標技巧的最高境界了,如果掌握了此演算法,可以解決一大類子字串匹配的問題,不過「滑動視窗」演算法比上述的這些演算法稍微複雜些,將再詳細記錄。 雙指標技巧彙總
源自 labuladong 鍊錶指標陣列題,用雙指標別猶豫 快慢指標最神奇,鍊錶操作無壓力 歸併排序找中點,鍊錶成環搞判定 左右指標很常見,左右兩端向前行 反轉陣列要靠他,二分查詢是弟弟 2.已知鍊錶中含有環,返回這個環的起始位置 3.尋找鍊錶的中點 4.尋找鍊錶的倒數第 k 個元素 二 左右指標 ...
快慢指標 雙指標
雙指標 二 左右指標的常用演算法 鏈結 利用快慢指標 最開始slow與fast指標都指向鍊錶第乙個節點,前者解決主要解決鍊錶中的問題,listnode detectcycle listnode head slow head while slow fast return slow 設相遇點距環的起點的...
快慢指標問題
快慢指標可以用來檢測鍊錶是否有環,問題是為什麼快指標一定會追上慢指標呢?從數學的角度,當快指標步長為2時,慢指標走完一圈,此時快指標走完2圈,必定在第乙個節點相遇 以此類推,當快指標步長為n時,慢指標走完一圈,此時快指標走完n圈,必定會在第乙個節點相遇,但是初次遇見未必是在第乙個節點 有意思的是從物...