链表环查找(Linked List Cycle II)

问题:

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Follow up:
Can you solve it without using extra space?

分析:

在链表中查找环,并且判断起始位置,本能反应时对已经走过的节点进行标记,如果有再次访问则有环,且起点为该点。但是要求without using extra space。所以只能换个思路。 判断单链表是否存在环及寻找环的入口点 文章里写了三个方案,很清晰,自己整理了下选择了fast ,slow指针法。

推理过程:

1.fast和slow每次分别走2步,1步,如果有环则一定会相遇。

2.针对查找开始点,总结起来就是相遇后fast从头开始走每次一步,下一次和slow相遇的地方为循环开始的地方。

如图起始点为O,fast和slow相遇点为A,循环起始点为P。则|OP|+|PA| = |OA|,|OA|为slow走过了路线长,设定为n,则fast走过2n,所以slow在走n步会回到A点。而fast从头走n步也会到大A点,所以在fast和slow下次相遇时一定是在P处,即没有完全走完n步(除非相遇在P)。

代码 :

 ListNode *detectCycle(ListNode *head) {
        ListNode * fast = head, * slow = head;
    	while(fast != NULL && fast->next != NULL)
    	{
    		fast = fast->next->next;
    		slow = slow->next;
    		if(fast == slow) break;
    	}
    	if(fast == NULL || fast->next == NULL ) return NULL; //无环
    	else
    	{
    		fast = head;
    		while( fast != slow )
    		{
    			fast = fast->next;
    			slow = slow->next;
    		}
    		return fast;
    	}
    }
又写了几个测试,测试各种特殊情况,测试通过,上传。

蛮顺利~fighting~~

前两天的二叉树便利和列表排序没写,但是两个都蛮简单的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值