单链表环的问题
1.给定一个单链表,判断是否有环
2.如果有环,则返回环的入口节点,否则返回null
链表结构
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
方法一:哈希表
//哈希法
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
unordered_set<ListNode*> myset;
while(pHead!=nullptr){
if(myset.count(pHead)==0){
myset.insert(pHead);
pHead = pHead->next;
}else{
return pHead;
}
}
return nullptr;
}
};
方法二:双指针法
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode* fast;
ListNode* slow;
fast = slow = pHead;
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 = pHead;
while(fast!=slow){
fast = fast->next;
slow = slow->next;
}
return fast;