剑指offer-链表中环的入口结点-java

题目描述

一个链表中包含环,请找出该链表的环的入口结点。

思路解析

  • 快慢指针可以检查链表中的环,如果相遇就是有环
  • 找入口的方法是省略许多圈后,举个简单的例子,下面这种情况是c+a=a+b,此时c=b,所以相遇点继续向前到达入口的距离是和头结点到入口的距离是一样的。
                                                         

代码

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(pHead==null||pHead.next==null||pHead.next.next==null)
            return null;
        ListNode fast = pHead.next.next;
        ListNode slow = pHead.next;
        while(fast!=slow){//两个相遇时,会跳出循环
            if(fast.next!=null&& fast.next.next!=null){
                fast = fast.next.next;
                slow = slow.next;
            }else{//否则没有环
                return null;
            }
        }
        //循环出来的就是有环,且此时fast==slow
        fast = pHead;//让快指针在头结点,这样相遇的是环的入口
        while(fast!=slow){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

猜你喜欢

转载自blog.csdn.net/lynn_baby/article/details/80082027