数据结构与算法:链表相关算法(环形链表)

算法:给定一个链表,返回链表开始入环的第一个结点。如果链表无环,则返回NULL。

思路:定义快慢指针,慢指针走一步,快指针走两步。slow进环后,在一圈以内,fast一定会追上slow,slow指针进环之前,fast有可能在环里面转了N圈,如果入环前的长度越长,环越小,N是越大的。如果入环前的长度越短,环越大,那N就是1,fast只转了一圈。

通过结论:一个指针从相遇点开始走,另一个指针从head走,他们会在入口点相遇。证明如下:
数据结构与算法:链表相关算法(环形链表)_第1张图片

struct ListNode* detectCycle(struct ListNode* head) {
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next) {
		slow = slow->next;
		fast = fast->next->next;
		
		//推到的结论一个指针从相遇点开始走,一个指针从head走,他们会在入口点相遇
		if (slow == fast) {
			struct ListNode* meet = slow;
			while (head!=meet) {
				head = head->next;
				meet = meet->next;
			}
			return meet;
		}
	}
	return NULL;
}

你可能感兴趣的:(链表,算法,数据结构)