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