LeetCode 142-環形連結串列II
阿新 • • 發佈:2019-01-01
142-環形連結串列II
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。
為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該連結串列中沒有環。
說明:不允許修改給定的連結串列。
Example 1
輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:連結串列中有一個環,其尾部連線到第二個節點。
Example 2
輸入:head = [1,2] , pos = 0
輸出:tail connects to node index 0
解釋:連結串列中有一個環,其尾部連線到第一個節點。
Example 3
輸入:head = [1], pos = -1
輸出:no cycle
解釋:連結串列中沒有環。
思路
這道題一開始就沒有思路,後來看了下題目評論中的想法,這道題還是有點考智商的。。。
首先雙指標來判斷是否有環,有環的話,快指標從頭開始單步走,當再次遇到慢指標時,所指結點就是開始入環的第一個結點。
這裡有兩點要注意:
快指標所走的速度是慢指標的2倍,當快指標開始單步走時,再次相遇的結點就是入環的第一個結點
程式碼
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
if(head == NULL || head->next == NULL) return NULL;
struct ListNode *fast = head;
struct ListNode *slow = head;
int isPrime=0;
while(fast && slow && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(fast == slow)
{
isPrime = 1;
fast = head;
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return slow;
break;
}
}
return NULL;
}