1. 程式人生 > >LeetCode 142-環形連結串列II

LeetCode 142-環形連結串列II

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; }