1.判断环形链表入环的结点,有两种方法。第一种,由于创建链表在内存申请空间由低到高,那一定存在一个结点的next存放的地址比结点的地址小。
struct ListNode* detectCycle(struct ListNode* head)
{
while (head->next != NULL)
{
head = head->next;
if (head->next < head)
{
return head->next;
}
}
return NULL;
}
第二种找到快慢指针的相遇点。定义快指针一次走两个结点,慢指针一次走一个结点。两个指针相差一步,所以一定会相遇。快指针是慢指针速度的两倍,推理得快指针从相遇点走n圈和慢指针走到相遇点花相同的时间。快指针从相遇点走也一定会和慢指针从头走在入环结点相遇。
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* slow = head;
struct ListNode* fast = head;
struct ListNode* meet = NULL;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
meet = fast;
break;
}
}
if(fast == NULL || fast->next == NULL)
{
return NULL;
}
slow = head;
while(slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return fast;
}