1. 程式人生 > >LeetCode142. Linked List Cycle||(環形連結串列)——— 判斷連結串列是否有環以及求其入環節點

LeetCode142. Linked List Cycle||(環形連結串列)——— 判斷連結串列是否有環以及求其入環節點

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(nullptr) {}
};
//判斷連結串列是否有環
//方法:
//1、空間複雜度n:使用set集合儲存每一個節點,判斷是否有重複
//2、空間複雜度1:使用兩個指標,快指標走兩步,慢指標走一步;
//				  若快指標為null則無環。
//				  若快指標與慢指標相遇,快指標回到開頭與慢指標一起每次只走一步,直至相遇為入環節點。
class Solution {
public:
	ListNode * detectCycle(ListNode *head) {
		if (head == nullptr || head->next == nullptr)return nullptr;
		ListNode *fastp = head, *slowp = head;
		while (true)
		{
			if (fastp->next == nullptr || fastp->next->next == nullptr)return nullptr;//快指標為null則無環 + 防止訪問到空指標
			fastp = fastp->next->next;
			slowp = slowp->next;
			if (slowp == fastp)break;//快指標與慢指標相遇,則有環
		}
		fastp = head;
		while (fastp != slowp)
		{
			fastp = fastp->next;
			slowp = slowp->next;
		}
		return slowp;
	}
};