【LeetCode】142. 環形鏈表 II

解題思路

hashmap法

思路簡單,時間複雜度O(n),空間複雜度O(n)

Floyd法

知道結論進行編程容易,但是自己推導出Floyd公式比較難,理解該方法,進行編程即可
時間複雜度O(n),空間複雜度O(1)

代碼

hashmap法

class Solution {
public:
	ListNode* detectCycle(ListNode* head) {
		if (head == nullptr || head->next == nullptr) return nullptr;
		unordered_map<ListNode*, int> nodeMap;
		ListNode* cur = head;
		while (cur)
		{
			if (nodeMap.find(cur) != nodeMap.end()) return cur;
			nodeMap[cur]++;
			cur = cur->next;
		}
		return nullptr;
	}
};

Floyd法

class Solution {
public:
	ListNode* detectCycle(ListNode* head) {
		//特判
		//排除空節點或單個節點不成環的情況
		if (head == nullptr || head->next == nullptr) return nullptr;
		ListNode* slow, * fast;
		slow = head;//slow和fast要從head同時出發,要不然根據Floyd的原理進行指針移動會發生死循環
		fast = head;
		while (fast && fast->next)
		{
			slow = slow->next;
			fast = fast->next->next;
			if (fast==slow)//存在環
			{
				fast = head;//fast重置爲head,slow不變,然後fast和slow現在開始每次只走一步,相遇點就是環的入口
				while (fast!=slow)
				{
					fast = fast->next;
					slow = slow->next;
				}
				return fast;
			}
		}
		return nullptr;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章