给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
int lenA = 0;
int lenB = 0;
struct ListNode* curA = headA;
struct ListNode* curB = headB;
while(curA && curA->next)
{
lenA++;
curA = curA->next;
}
while(curB && curB->next)
{
lenB++;
curB = curB->next;
}
//1.不相交
//2.相交,求交点
if(curA != curB)
{
return NULL;
}
else
{
int gap = abs(lenA - lenB);
struct ListNode* longlist = headA, * shortlist = headB;
if(lenA < lenB)
{
longlist = headB;
shortlist = headA;
}
while(gap--)
{
longlist = longlist->next;
}
while(1)
{
if(longlist == shortlist)
{
return longlist;
}
else
{
longlist = longlist->next;
shortlist = shortlist->next;
}
}
}
}
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* fast = head,* slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
{
struct ListNode* l1 = head,* l2 = fast->next;
fast->next = NULL;
return getIntersectionNode(l1,l2);
}
}
return NULL;
}