算法之鏈表環路檢測

問題描述

給定一個有環鏈表,實現一個算法返回環路的開頭節點。
有環鏈表的定義:在鏈表中某個節點的next元素指向在它前面出現過的節點,則表明該鏈表存在環路。

示例 1:
輸入:head = [1,2,3,4], pos = 1
輸出:tail connects to node index 1
解釋:鏈表中有一個環,其尾部連接到第二個節點。

示例 2:
輸入:head = [5,3], pos = 0
輸出:tail connects to node index 0
解釋:鏈表中有一個環,其尾部連接到第一個節點。

示例 3:
輸入:head = [3], pos = -1
輸出:no cycle
解釋:鏈表中沒有環。

要求空間複雜度爲o(1)

算法實現

/**
 * Definition for singly-linked list.
 * 1. 先通過快慢指針,求得相遇點(fast指針速度是slow的2倍)
 * 2. 再將fast指針從head開始,slow指針從相遇點開始,以相同的速度往下走,直到相遇,那麼此時的相遇點就是“環路的頭結點”
 */ 
public class Solution {

    public ListNode detectCycle(ListNode head) {
        //先求相遇點
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(slow==fast){
                break;
            }
        }
        //如果沒有相遇點返回NULL
        if(fast==null||fast.next==null){
            return null;
        }
        //將快慢指針中的快指針重置到頭部,
        //並且與慢指針一起勻速往後奏,相遇點就是入口點
        fast = head;
        while(fast!=slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章