3. 链表求环

已知链表中可能存在环,若有环返回环起始节点,否则返回NULL

如图:
3. 链表求环_第1张图片

方法一:使用set求环起始节点

  1. 遍历链表,将链表中节点对应的指针(地址)插入set中;
  2. 在遍历时插入节点前,需要在set中查找,第一个在set中发现的节点地址即为链表环的起点。
ListNode* detectCycle(ListNode* head)
{
    set node_set;            // 设置查找集合node_set
    while(head)
    {
        if( node_set.find(head) != node_set.end() )     // 如果node_set中已经出现head,则返回head
        {
            return head;
        }
        node_set.insert(head);
        head = head->next;
    }
    return NULL;
}

方法二:快慢指针思想

主要思想

ListNode* detectCycle(ListNode* head)
{
    ListNode* fast = head;
    ListNode* slow = head;
    ListNode* meet = NULL;
    while(fast)
    {
        fast = fast->next;
        slow = slow->next;
        if( !fast )
        {
            return NULL;
        }
        fast = fast->next;
        if (fast == slow)
        {
            meet = fast;
            break;
        }
    }
    if (meet == NULL)
    {
        return NULL;
    }
    while(head && meet)
    {
        if( head == meet )
        {
            return head;
        }
        head = head->next;
        meet = meet->next;
    }
    return NULL;
}

方法一c++代码
方法二c++代码

你可能感兴趣的:(3. 链表求环)