LeetCode 面試題☞環形鏈表【快慢指針/哈希表】

題目描述

  • 題目
  • 給定一個鏈表,判斷鏈表中是否有環。
  • 爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
  • 示例

  • 示例 1:
    在這裏插入圖片描述

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

在這裏插入圖片描述

	輸入:head = [1,2], pos = 0
	輸出:true
	解釋:鏈表中有一個環,其尾部連接到第一個節點。
  • 示例三
    在這裏插入圖片描述

      輸入:head = [1], pos = -1
      輸出:false
      解釋:鏈表中沒有環。
    

解題

哈希表版本
  • 使用哈希map,將結點地址和出現的次數存儲起來(出現次數越多,其值越大)
  • 在哈希表中查看是否存在出現次數大於1的,若有則說明鏈表中有環存在
代碼實現
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head==nullptr){
            return false;
        }
        if(head->next==nullptr){
            return false;
        }
        unordered_map<ListNode*,int> map;
        ListNode* cur=head;

        while(cur){
            map[cur]++;
            if(map[cur]>1){
                return true;
            }
            cur=cur->next;
        }
        return false;
    }
};
快慢指針
  • 跑步比賽採用圓形跑道,假設有兩個運動員不停的奔跑.且一個運動員跑得快,一個跑的慢,那麼兩個運動員肯定會有再次相遇的時候.

在這裏插入圖片描述

  • 同樣的道理,定義兩個指針(一個一次移動1步,一個一次移動兩步),若鏈表中存在環形結構的話,那麼走到快的指針肯定會追上走的慢的指針.
代碼實現
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* slow=head;
        ListNode* fast=head;


        while(fast&& fast->next){
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast)
            return true;
        }
        return false;
    }
};

原題🔗

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