剑指OFFER_链表中环的入口节点

剑指OFFER_链表中环的入口节点

题目描述

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

思路

我的思路效率不是很高,就是遍历这个链表,同时把节点地址存进容器,然后判断新的节点地址是否已经访问过,如果是则表示是一个环,返回此地址;

不过我的容器选择有点不好,我用的vector,还自己写了一个搜索是否访问的函数,但是其实用set效率会更高,把两份代码都贴出来:

代码-vector版本

typedef vector<ListNode*> vec;
class Solution {
public:
    bool findNode(vec &v, ListNode *node) {
        for (ListNode *n:v) {
            if (n==node) {
                return true;
            }
        }
        return false;
    }
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode *ans = nullptr;
        ListNode *node = pHead;
        vec v;
        while (node) {
            if (findNode(v, node)) {
                return node;
            }
            v.push_back(node);
            node = node->next;
        }
        return ans;
    }
};

代码-set版本

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        unordered_set<ListNode*> st;
        while (pHead) {
            if (st.find(pHead) == st.end()) {
                st.insert(pHead);
                pHead = pHead->next;
            }
            else {
                return pHead;
            }
        }
        return nullptr;
    }
};
原文地址:https://www.cnblogs.com/sakurapiggy/p/13276191.html