双指针-滑动窗口问题(Leetcode题的java实现)

Leetcode141. 判断链表中是否有环

  • 思路:设定快慢双指针,慢指针+1则快指针+2。如果不含有环,快指针最终会遇到 null,说明链表不含环;如果含有环,快指针最终会超慢指针⼀圈,和慢指针相遇,说明链表含有环。时间复杂度为O(n)。
public class Solution {
     
    //如果环的长度为 M,经过 M 次迭代后,快指针肯定会多绕环一周,赶上慢指针。
    public boolean hasCycle(ListNode head) {
     
        if (head == null || head.next == null) 
           return false;
        ListNode slow = head;
        ListNode fast = head;
        while (fast == null || fast.next == null) {
     
            //如果没有环,快指针将停在链表的末尾。快指针每次走两步
            slow = slow.next;
            fast = fast.next.next;
            if (fast == slow) {
       return true; }
        }
        return false;
    }
}

Leetcode142. 判断链表的环入口

  • 思路:双指针;和环形链表简单题一样用快指针和慢指针
    (1)第一次相遇时,有fast =slow + k环长度 和 fast =2slow 可得slow=k环长度。注:假设一个指针从链表头开始走a步可到环入口节点,那么从链表头走到环入口的步数是 a + k环长度,所以slow在第一次相交后再走a步可到环入口
    (2)第一次两指针相遇后,让快节点指回链表头部。然后快慢指针同步前行,这样就可以保证第二次相遇时,快慢指针正好指向环入口
public ListNode detectCycle(ListNode head) {
     
          if(head==null) return null;
          ListNode slow = head;
          ListNode fast = head;
          while (fast != null && fast.next != null) {
     
              fast = fast.next.next;
              slow = slow.next;
              if (fast == slow) break;
          }
          fast = head;  //快指针指回头结点
          while(slow!=fast){
       //第二次相交前快慢指针都一步步走
              fast = fast.next;
              slow = slow.next;
          }
          return slow;
    }

Leetcode443.压缩字符串

class Solution {
     
    public int compress(char[] chars) {
     
        public int compress(char[] chars) {
     
        if(chars.length == 0) return 0;
        int p=0; int left=0,right =1; // p指针指向最新修改的数组位,还有两个窗口的左右指针
        while(left<chars.length){
     
            chars[p++] = chars[left];//p位存下左字符后+1
            while(right<chars.length && chars[left]==chars[right]){
     
                right++;  //相同时溢出
            }
            if(right-left >1){
     
                String temp = String.valueOf(right-left);
                for(char ch:temp.toCharArray()){
     
                    chars[p++] = ch;
                }
            }
            left = right;
        }
        return p;
    }
}

你可能感兴趣的:(算法的代码实现,链表,指针,算法)