【leetcode 刷題日記】09-環形鏈表(C++快慢指針)

141.環形鏈表

題目

給定一個鏈表,判斷鏈表中是否有環。爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
這裏的pos和解題沒啥關係,是leetcode測試用的。

示例

示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。

示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。

思路

這個題目的pos寫的很迷惑哈哈,還以爲鏈表給了末尾結點的值呢,如果pos等於-1就無環,其他值就有環。寫完發現不對纔看的題解,原來題目的意思就是讓判斷是不是有環的鏈表。
這裏發現了一個很有意思的思路,即快慢指針
假設有快慢兩個運動員,快的運動員一次跑兩步,慢的運動員一次跑一步,如果跑道是圓環的,那麼第二圈的時候一定會相遇,如果是直線的就不會相遇。以兩個運動員是否相遇作爲有環和無環的判斷條件。

代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head==NULL)
        return false;
        ListNode* fast{ head };//快指針
        ListNode* slow{ head };//慢指針
        while(fast->next!=NULL&&fast->next->next!=NULL)
        {
            fast=fast->next->next;//快的運動員一次跑兩步
            slow=slow->next;//慢的運動員一次跑一步
            if(fast==slow)//如果相遇代表有環
            return true;
        }
        return false;
    }
};

提交記錄

昨天說的要開始看論文了,可惜今天學校雲開課有五節課,還要改師兄的論文圖,感覺是沒時間看論文了。有想法把看論文的筆記也放在csdn上更新,編輯起來還是比較方便的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章