算法通关村第一关——找环入口

Problem: 142. 环形链表 II

思路

使用快慢指针的方法来检测链表中是否存在环,并找出环的起始节点。

解题方法

  1. 首先判断链表是否为空或者只有一个节点,如果是,则不可能存在环,直接返回null
  2. 初始化快慢指针,初始位置都为头节点。
  3. 使用一个循环来判断快慢指针是否相遇,同时快指针每次移动两步,慢指针每次移动一步。
  4. 如果快慢指针相遇,说明链表中存在环,将慢指针重新指向头节点,并将快指针与慢指针以相同的速度移动,直到它们再次相遇。
  5. 返回相遇点,即为环的起始节点。
  6. 如果快指针或快指针的下一个节点为空,说明链表中不存在环,返回null。

复杂度

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

Code

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null){
            return null;
        }
        ListNode fast = head, slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                slow = head;
                while(fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return slow;
            }
        }
        return null;
    }
}

你可能感兴趣的:(算法通关村,算法)