环形链表
描述
给定一个链表,判断链表中是否有环。
思路和代码
思路1:用一个哈希表,将每一个遍历到的节点加入哈希表中,如果遍历到节点已经出现在了哈希表中则证明有环.
思路2:一个指针走一步,一个指针走两步,若有环,则两个指针必会相遇.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(fast == slow)
return true;
}
return false;
}
};
环形链表2
描述
在有环的基础上,返回入环的第一个节点
- 快指针和慢指针,快指针走两步,慢指针走一步,若相遇则有环
- 相遇之后,快指针返回head,慢指针在相遇这一点,之后快慢指针每次都走一步,下一次相遇的点就是入环点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getIntersect(ListNode* head)
{
ListNode* fast = head;
ListNode* slow = head;
while(fast->next!=NULL && fast->next->next!=NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
return fast;
}
return NULL;
}
ListNode *detectCycle(ListNode *head) {
if(head == NULL)
return NULL;
ListNode* intersect = getIntersect(head);
if(intersect == NULL)
return NULL;
ListNode* fast = head;
ListNode* slow = intersect;
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
};
来源:CSDN
作者:amor_1
链接:https://blog.csdn.net/amor_1/article/details/104752766