链表中环的入口节点
题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
- 确定是否存在环。用两个指针,一快一慢,快的追上慢的,则包含环
- 找到环的入口。让快的指针先走n(环的长度)步,然后快慢指针以相同的速度向前推进,两指针相遇,则是环的入口
- 确定环的长度。定义两个指针,一块一慢,相遇时在环中,然后从相遇点出发,边走边计数,知道下次在走到相遇点
class Solution { public: ListNode* EntryNodeOfLoop(ListNode* head) { if (head == nullptr || head->next == nullptr) { return nullptr; } ListNode *slow = head; ListNode *fast = head; while (fast != nullptr && fast->next != nullptr) { fast = fast->next->next; slow = slow->next; if (slow == fast) { break; } } if (fast == nullptr || fast->next == nullptr) {//不存在环 return nullptr; } fast = head; while (fast != slow) { fast = fast->next; slow = slow->next; } return slow; } };