博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链表中环的入口结点
阅读量:7043 次
发布时间:2019-06-28

本文共 1561 字,大约阅读时间需要 5 分钟。

题目描述

一个链表中包含环,请找出该链表的环的入口结点。
【转】牛客网
方法一:

 

假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程)

当快慢指针相遇的时候:

此时慢指针走的路程为Sslow = x + m * c + a

快指针走的路程为Sfast = x + n * c + a
2 Sslow = Sfast
2 * ( x + m*c + a ) = (x + n *c + a)
从而可以推导出:
x = (n - 2 * m )*c - a
= (n - 2 *m -1 )*c + c - a
即环前面的路程 = 数个环的长度(为可能为0) + c - a
什么是c - a?这是相遇点后,环后面部分的路程。(橙色路程)
所以,我们可以让一个指针从起点A开始走,让一个指针从相遇点B开始继续往后走,
2个指针速度一样,那么,当从原点的指针走到环入口点的时候(此时刚好走了x)
从相遇点开始走的那个指针也一定刚好到达环入口点。
所以2者会相遇,且恰好相遇在环的入口点。

最后,判断是否有环,且找环的算法复杂度为:

时间复杂度:O(n)

空间复杂度:O(1)

代码:

ListNode* EntryNodeOfLoop(ListNode* pHead)    {        if(pHead == NULL||pHead->next == NULL||pHead->next->next == NULL)            return NULL;        ListNode* tmp1 = pHead->next;        ListNode* tmp2 = pHead->next->next;        while(tmp1 != tmp2)        {            if(tmp2->next != NULL || tmp2->next->next == NULL)            {                tmp1 = tmp1->next;                tmp2 = tmp2->next->next;            }            else               return NULL;        }//相遇点        tmp1 = pHead;        while(tmp1 != tmp2)        {            tmp1 = tmp1->next;            tmp2 = tmp2->next;        }        return tmp1;    }

 

方法二:断链法

遍历一遍并将链的next置空,这样链中就不存在环了。

直到遍历到最后的节点就是环的入口节点。

由于要判断next节点,所以需要两个节点,其中一个节点记录上一节点。

代码:

publicListNode EntryNodeOfLoop(ListNode pHead){ if(pHead==null|| pHead.next==null)returnnull;     ListNode fast=pHead.next;     ListNode slow=pHead;     while(fast!=null){         slow.next=null;         slow=fast;         fast=fast.next;     }     returnslow; }

 

转载于:https://www.cnblogs.com/Lune-Qiu/p/9163784.html

你可能感兴趣的文章
mysql处理添加外键时 error 150 问题
查看>>
企业如何针对用户数据进行有效保护
查看>>
Tomcat启动时报 java.lang.OutOfMemoryError: Java heap space
查看>>
Active Directory 基础回顾 (三)FSMO迁徙方式小总结
查看>>
Shell Script不同运行方式的区别
查看>>
Linux系统基本网络配置之ifconfig命令
查看>>
看几大IT公司的JSON利器
查看>>
Cocos2d-x 物理场景简单搭建
查看>>
认识“JPG、TXT”格式的病毒
查看>>
redhat6.2配置本地yum源
查看>>
IBM System x3850 X5如何级联
查看>>
php 类,对象,继承,接口,抽象
查看>>
修改开机提示
查看>>
RAID的使用详解
查看>>
redis 集群架构 cluster 、sentinel
查看>>
将 jsonString 转化成成java对象
查看>>
tomcat配置与应用(1)
查看>>
51cto PMP认证微职位4期强化班心得
查看>>
Go中常用包笔记 内置builtin(一)
查看>>
js-->贪吃蛇小游戏,能成功玩
查看>>