public class Solution {
    public ListNode detectCycle( ListNode head ) {
        if( head == null || head.next == null ){
            return null;
        }
        // 快指针fp和慢指针sp,
        ListNode fp = head, sp = head;
        while( fp != null && fp.next != null){
            sp = sp.next;
            fp = fp.next.next;
            //此处应该用fp == sp ,而不能用fp.equals(sp) 因为链表为1 2 的时候容易
            //抛出异常
            if( fp == sp ){  //说明有环
                break;
            }
        }
        //System.out.println( fp.val + "   "+ sp.val );
        if( fp == null || fp.next == null ){
            return null;
        }
        //说明有环,求环的起始节点
        sp = head;
        while( fp != sp ){
            sp = sp.next;
            fp = fp.next;
        }
        return sp;
    }
}

 

补充一个python的实现:

 1 class Solution:
 2     def detectCycle(self, head: ListNode) -> ListNode:
 3         if head == None or head.next == None:
 4             return None
 5         slow,fast = head,head
 6         while fast != None and fast.next != None:
 7             slow = slow.next
 8             fast = fast.next.next
 9             if slow == fast:
10                 break
11         if fast == None or fast.next == None:
12             return None
13         slow = head
14         while slow != fast:
15             slow = slow.next
16             fast = fast.next
17         return slow

 

posted on 2018-10-15 15:01  Sempron2800+  阅读(167)  评论(0编辑  收藏  举报