题解 | #链表中环的入口结点#
1.题目
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围:
要求:空间复杂度 O(1),时间复杂度 O(n)
2.思路 设立快慢两个指针,slow指针和fast指针。
fast的速度为slow的两倍,当slow走一步的时候,fast要走两步。
当没有环时候,fast会走到NULL,判断fast是不是NULL就可以了。
而当有环的时候:
设fast和slow相遇时,slow走的距离为(X+Y),fast走的距离为2*(X+Y)。
而X需要再走CB(顺时针)这段距离,就能到入口点,而这段距离为2*(X+Y)-X-2*Y=X
所以只需要将此时相遇在C点的fast放回原来的pHead处,并按照和slow相同的速度行动,最终两个指针就将在入口处相遇。
3.代码
C++:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* slow = pHead;
ListNode* fast = pHead;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) break;
}
if (fast == NULL || fast->next == NULL) return NULL;
fast = pHead;
while(fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
};
python:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
slow = pHead
fast = pHead
while fast is not None and fast.next is not None:
slow = slow.next
fast = fast.next.next
if slow == fast:
break
if fast is None or fast.next is None:
return None
fast = pHead
while fast != slow:
fast = fast.next
slow = slow.next
return fast