天天看點

LeetCode 雙指針的應用

在看一位大佬關于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;
    }