LeetCode Linked List Cycle II 超时问题

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Follow up:
Can you solve it without using extra space?

题目意思很简单,判断链表是否有环,若有,返回环的位置。

一开始,用了原来I的方法,结果会出现超时。

    public ListNode detectCycle(ListNode head) {
        boolean iscycle=false;  
        if (head!=null) {
                ListNode temp=head;
                while (!iscycle) {
                    head=head.next;
                    temp.next=temp;
                    temp=head;
                    if (head==null) {                        
                        return null;
                    }else {
                        if (head.next==head) {
                            return head;
                        }
                    }
                }
        }
        return head;
    }

后来发现,我这个算法必须遍历完链表。

查看了网上其他方法。如下算法:

    对于判断链表是否有环,方法很简单,用两个指针,一开始都指向头结点,一个是快指针,一次走两步,一个是慢指针,一次只走一步,当两个指针重合时表示存在环了。

    证明:假设链表有环,环的长度为N,慢指针在起始位置,快指针在位置k(位置从0开始计数),那么快指针只要比慢指针多走经过N-k步,就可以追上慢指针了。。。,因为每一次快指针都比慢指针多走一步,所以一定可以在有限的步数追上慢指针。

  成功ac。

/**
 * 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) {
    ListNode node = null;
    if(head == null)
      return node;
    ListNode quick = head;
    ListNode slow = head;
    
    boolean tag = false;
    while(quick!=null &&quick.next != null)
    {
      quick = quick.next;
      quick = quick.next;
      slow = slow.next;
      if(quick == slow)
      {
        tag = true;
        break;
      }
    } 
    if( tag  == false)
    {
      return node;
    }
    else
    {
      quick = head;
      while( true)
      {
        if( quick == slow)
        {
          return quick;
        }
        else
        {
          quick = quick.next;
          slow = slow.next;
        }
      }
    }
  }
}
原文地址:https://www.cnblogs.com/birdhack/p/3944639.html