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?

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

 //思路:
首先利用快慢双指针向后遍历(slow每次向后一格,fast每次向后两格),当两个指针重合时,则list中一定存在cycle
然后让fast_pointer停在两指针相遇的位置,而让slow_pointer回到head,让两指针同步的每次向后遍历一格,则两指针相遇的node即为cycle begin的node(有点像单纯的智力题。。。)

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head==null || head.next==null) return null;
        
        ListNode slow_pointer = head;
        ListNode fast_pointer = head;
        
        boolean hasCycle = false;
        while(fast_pointer!=null && fast_pointer.next!=null){  //判断list中是否有cycle的存在,思路与昨天的题一样
            slow_pointer = slow_pointer.next;
            fast_pointer = fast_pointer.next.next;
            if(slow_pointer == fast_pointer){
                hasCycle = true;
                break;                //注意:此处要有break,否则两个pointer会在cycle中一直遍历下去,无限循环
            }
        }
        
        if(hasCycle){        
            slow_pointer = head;
            while(true){
                if(slow_pointer == fast_pointer) return slow_pointer;
                slow_pointer = slow_pointer.next;
                fast_pointer = fast_pointer.next;
          //if(slow_pointer == fast_pointer) return slow_pointer;  注:判断的语句不能放在后边,不然当list中tail.next=head时会出错
            }
        }
        
        return null;
    }
}



原文地址:https://www.cnblogs.com/dosmile/p/6444457.html