leetcode:142. 环形链表 II

简介: leetcode:142. 环形链表 II

一、题目

 

函数原型:

struct ListNode *detectCycle(struct ListNode *head)

二、思路

要找到入环结点,就要计算头结点到入环结点之间的距离。

设链表环外的长度为a;慢指针与快指针相遇时,它们逆时针到入环结点的距离为b,顺时针到入环结点的距离为c,那么链表中环的长度就是b+c。

当慢指针与快指针相遇时,设快指针已经在环内走了n圈。由于快指针走过的距离始终是慢指针的两倍,因此a+b+n(b+c)=2(a+b),即a=c+(n-1)(b+c)。

有上述式子可得,头结点到入环结点间的距离就等于快、慢指针相遇位置顺时针到入环结点的距离再加上(n-1)环的长度。

因此,如果设置一个遍历指针从头结点开始遍历,它与慢指针相遇时的位置就是入环结点位置。

三、代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    int answer=0;//判定有无环的标志
    while(fast&&fast->next)
    {
        fast=fast->next->next;//快指针一次走两步
        slow=slow->next;//慢指针一次走一步
        if(slow==fast)//快慢指针相遇
        {
            answer=1;
            break;
        }
    }
    if(answer==0)//找到了空结点,说明链表无环
        return NULL;
    else//链表有环
    {
        struct ListNode *cur=head;//遍历指针,从头结点开始遍历
        while(slow!=cur)//找遍历指针和慢指针相遇的位置
        {
            cur=cur->next;
            slow=slow->next;
        }
        return cur;//找到并返回入环结点
    }
}



目录
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
39 1
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
52 0
Leetcode第21题(合并两个有序链表)
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
28 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
47 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
96 0
|
2月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
23 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
18 0
|
2月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
13 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
32 0