题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/
题目要求:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。
解题思路
玩法一:大牛思路——> 一个指针从相遇点走,一个指针从链表头开始走,最终会在入口点相遇。
代码示例
玩法一代码示例如下:
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while(fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
struct ListNode* meet = slow;
while(meet!=head)
{
meet = meet->next;
head = head->next;
}
return meet;
}
}
return NULL;
}
玩法二代码示例如下:
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while(fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
struct ListNode* meet = slow;
struct ListNode* newhead = slow->next;
struct ListNode* tailA = head;
struct ListNode* tailB = newhead;
int lenA = 0;
int lenB = 0;
slow->next = NULL;
while(tailA->next)
{
tailA = tailA->next;
lenA++;
}
while(tailB->next)
{
tailB = tailB->next;
lenB++;
}
int gap = abs(lenA-lenB);
struct ListNode* longlist = head;
struct ListNode* shortlist = newhead;
if(lenAnext;
}
while(shortlist!=longlist)
{
shortlist = shortlist->next;
longlist = longlist->next;
}
return longlist;
}
}
return NULL;
}
这就是我对本题的理解,如果大家有更优的解,欢迎交流,一起进步!