链表中环的入口节点

题目

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路

  1. 确定是否存在环。用两个指针,一快一慢,快的追上慢的,则包含环
  2. 找到环的入口。让快的指针先走n(环的长度)步,然后快慢指针以相同的速度向前推进,两指针相遇,则是环的入口
  3. 确定环的长度。定义两个指针,一块一慢,相遇时在环中,然后从相遇点出发,边走边计数,知道下次在走到相遇点
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;
    }
};

 

posted on 2018-12-26 11:35  tianzeng  阅读(126)  评论(0编辑  收藏  举报

导航