每日一题——链表中环的入口

简介: 每日一题——链表中环的入口

链表中环的入口节点

题目链接

思路(双指针法)

  • 第一步:第一步当然是判断该链表是否存在环。由昨天的题目判断链表是否有环,可以很简单的进行判断
  • 第二步:即找到环的入口节点。
  • 我们可以在第一步中可以得到快慢指针相遇的节点位置,可以设相遇节点到头节点的距离为X,环入口节点到相遇节点的距离为Y(从左到右),相遇节点到环入口节点的距离为Z(从右到左),如此图中,X = 2, Y = 2, Z = 2
  • 如图:
  • 由分析可得:当快慢指针相遇时,慢指针slow一共走了X + m(Y + Z) + Y个节点,快指针fast一共走了X + n(Y + Z) + Y个节点,我们预定快指针fast每次比慢指针slow多走一个节点,则X + n(Y + Z) + Y = 2(X + m(Y + Z) + Y),即X + Y = (n - 2m)(Y + Z),即X = (n - 2m - 1)(Y + Z) + Z。
  • 我们可以再定义连个指针index1,index2,令index1指向链表头,index2指向快慢指针相遇的节点,并每次让index1,index2每次一起走一个节点,由X = (n - 2m - 1)(Y + Z) + Z可知,index1走到环入口节点所走过的节点数恰好等于index2走到环入口节点所走过的节点数加上整数倍环的节点数,即当index1与index2相遇的点即为环的入口节点。

实现代码

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
struct ListNode * Judge_Loop(struct ListNode *pHead)  //判断链表是否有环的函数,如果没有,则返回NULL,如果有,则返回相遇的节点
{
    if(!pHead)
        return NULL;
    struct ListNode*fast,*slow;
    fast = slow = pHead;
    while(slow && fast)
    {
        slow = slow->next;
        if(!fast->next)
            return NULL;
        fast = fast->next->next;
        if(fast == slow)
            return fast;
    }
    return NULL;
}
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) {
    if(!Judge_Loop(pHead))    //如果链表没有环,则直接返回NULL
        return NULL;
    struct ListNode* index1 = pHead;    //令index1指向表头
    struct ListNode* index2 = Judge_Loop(pHead);    //令index2指向相遇节点
    while(1)
    {
        if(index1 == index2)  //当index1和index2再次相遇时,相遇位置即为环的入口
            return index1;
        index1 = index1->next;    //index1,index2每次下滑一个位置
        index2 = index2->next;
    }
}


相关文章
|
5月前
|
人工智能 Java
每日一题《剑指offer》链表篇之链表中环的入口节点
每日一题《剑指offer》链表篇之链表中环的入口节点
56 0
每日一题《剑指offer》链表篇之链表中环的入口节点
|
6月前
|
算法
BM7 链表中环的入口结点
BM7 链表中环的入口结点
20 0
|
7月前
【面试必刷TOP101】链表中环的入口结点 & 链表中倒数最后k个结点
【面试必刷TOP101】链表中环的入口结点 & 链表中倒数最后k个结点
16 0
|
7月前
|
存储 索引
判断环形链表是否有环??返回环形链表的入口点!!
判断环形链表是否有环??返回环形链表的入口点!!
23 1
|
7月前
|
存储 C++ 容器
剑指offer(C++)-JZ23:链表中环的入口结点(数据结构-链表)
剑指offer(C++)-JZ23:链表中环的入口结点(数据结构-链表)
|
8月前
|
Java 测试技术
【Java】剑指offer(23)链表中环的入口结点
【Java】剑指offer(23)链表中环的入口结点
|
11月前
牛客网剑指offer刷题练习之链表中环的入口结点
牛客网剑指offer刷题练习之链表中环的入口结点
63 0
|
2月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
2月前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解