在看一位大佬關于LeetCode的題解時,發現他對于裡面可以雙指針的問題都做了總結。
個人覺得雙指針很簡單友善,可以降低複雜度。
有序數組兩數之和 && 兩數平方和:頭尾各設定一個指針,根據結果大小來判斷是哪一個指針移動。前提是有序。
反轉字元串中的元音音節:頭尾設定指針,遇到元音音節的時候不移動,直到兩個都是元音音節之後移動。
回文字元串:設定頭尾指針,依次對比,發現不一樣的時候,再分别試試去掉左邊的或右邊的之後,剩下的是否都相等。
歸并兩個有序數組到第一個數組上:如果沒有要求要到第一個數組上,可以新開一個數組,兩個數組都從頭開始比起,依次來。如果要求了,兩個都從尾部開始比,以免覆寫前面還沒有比較過的資料。
判斷連結清單是否有環:設定兩個指針,一個從頭開始,每次後移一個,一個從第二個開始,每次後移兩個,如果有環,則二者必然會有相遇的時候。
最長子序列:描述;删除 s 中的一些字元,使得它構成字元串清單 d 中的一個字元串,找出能構成的最長字元串。如果有多個相同長度的結果,傳回字典序的最小字元串。解答:為S與連結清單都設定指針,一個指向S的字元,一個指向連結清單裡面的元素。既然找最長的,每次都用最長的長度與連結清單指針相比,看看長度和字典序是否需要更新,如果有需要更新的,在判斷該連結清單元素是否可以通過删除S的一些字元構成。 https://mp.csdn.net/postedit/88784762
//連結清單中是否存在環
public boolean hasCycle(ListNode head) {
if(head == null)
return false;
ListNode n1 = head;
ListNode n2 = head.next;
while(n1!=null && n2!= null && n2.next!=null )
{
if(n2 == n1 )
return true;
n1 = n1.next;
n2 = n2.next.next;
}
return false;
}