問題描述
給定一個有環鏈表,實現一個算法返回環路的開頭節點。
有環鏈表的定義:在鏈表中某個節點的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;
}
}