這個是上一題的接續
如果說這個list是cycle的話,那麼請找出循環開頭的那個節點並回傳
Sol:
首先依照上一題的想法,我們可以知道說這個list是cycle的
但是我們找到的那個節點,其實並不一定是循環開始的節點
嗯... 這時候要用到一點數學...
slow一次前進一步,fast一次前進兩步
當slow和fast相同時,假設總共前進了K次好了
假設循環開始的節點是第N個節點好了
那麼循環開始的節點和slow跟fast相遇的節點間的距離就是K-N對吧
假設節點的總數是A,我們可以得出以下的式子:
A = 2K - (K - N) = K + N
=> N = A - K
這時候我們可以發現一個神奇的事情
slow和fast相遇的節點前進(A-K)次的話,就會達到循環開始的節點了
然後A-K=N...
所以我們只要找出slow和fast相遇的節點,然後從head開始,兩個節點一起前進
當兩個節點相遇時,那個節點就是循環開始的節點了
code大概長這樣:
ListNode *detectCycle(ListNode *head) {
if (head == nullptr || head->next == nullptr)
return NULL;
ListNode* slow = head;
ListNode* fast = head;
ListNode* entry = head;
while (fast->next != nullptr && fast->next->next != nullptr)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
{
while (entry != slow)
{
entry = entry->next;
slow = slow->next;
}
return entry;
}
}
return NULL;
}
就這樣了...
這題其實不太好想,我也是參考了其他網友的答案才看出端倪的
真的覺得網友都好厲害啊~~
學習學習~
留言列表