判断链表中是否有环、并找出环的入口
2017-07-06 15:36
141 查看
判断链表中是否有环的算法就是利用快慢指针
但是判断环的入口就有点麻烦了:
a:出发
b:入口点
c:快慢指针相遇点
只要知道ab需要走多少步,就确定了入口。
相遇的时候,慢指针从a走到了c,快指针从a出发,在环里面绕了n(n>1)圈到c相遇, 快-慢=n圈
快=2慢,2ac-ac=ac=ab+bc=n圈,那么ab=n圈-bc=(n-1)圈+(1圈-bc);所以从等式可以看出,从a出发到b相当于从c出发走(n-1)圈再走cb段:
public class Solution { public boolean hasCycle(ListNode head) { if(head==null||head.next==null)return false; ListNode slow=head; ListNode fast=head.next; while(fast.next!=null&&fast.next.next!=null){ if(slow==fast)return true; fast=fast.next.next; slow=slow.next; } return false; } }
但是判断环的入口就有点麻烦了:
a:出发
b:入口点
c:快慢指针相遇点
只要知道ab需要走多少步,就确定了入口。
相遇的时候,慢指针从a走到了c,快指针从a出发,在环里面绕了n(n>1)圈到c相遇, 快-慢=n圈
快=2慢,2ac-ac=ac=ab+bc=n圈,那么ab=n圈-bc=(n-1)圈+(1圈-bc);所以从等式可以看出,从a出发到b相当于从c出发走(n-1)圈再走cb段:
import java.util.*; public class Solution { public ListNode detectCycle(ListNode head) { if(head==null||head.next==null)return null; ListNode slow=head; ListNode fast=head; while(fast!=null&&fast.next!=null){ fast=fast.next.next; slow=slow.next; if(fast==slow){ ListNode fast1=head; while(fast1!=slow){ fast1=fast1.next; slow=slow.next; } return slow; } } return null; } }
相关文章推荐
- 判断链表是否存在环,找出环的入口
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
- 判断两个单链表是否相交同时找出第一个相交点(单链表是否有环及寻找入口节点)
- 判断链表是否含有环,若有则找出环的入口节点
- 判断链表是否存在环并找出环的入口
- 判断单链表是否是循环链表以及找出循环链表入口
- 判断单链表是否有环,如果有找出环的入口位置=>求两个相交链表的交点
- 判断一个链表是否有环,并找出环的入口
- 判断链表是否有环以及找出环的入口点知识总结
- 如何判断一个链表是否有环,如果有环,并找出环的入口
- 首先如何判断一个链表是否有环,并找出环的入口
- 判断两个链表是否相交并找出交点
- 判断链表有环没环及环的入口结点问题 和 判断两个链表是否相交
- 剑指offer 15---判断链表是否带环?若带环求环的长度?若带环求环的入口点?
- 如何判断一个链表是否有环? 2、如果链表为存在环,如果找到环的入口点?
- 判断链表是否有环 、 找到环的入口节点
- 判断两个链表是否相交并找出交点
- 【算法之链表(二)】判断两个链表是否相交并找出交点
- 用快慢指针判断单链表环,找到环入口 扩展到判断两个链表是否相交
- 面试题7:判断链表是否有环,返回环的入口点