close

這個是上一題的接續

如果說這個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;
    }

就這樣了...

這題其實不太好想,我也是參考了其他網友的答案才看出端倪的

真的覺得網友都好厲害啊~~

學習學習~

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()