九章算法 | 腾讯面试算法题:带环链表 II

撰文 | JZ
专栏 | 九章算法

题目描述

给定一个链表,若是链表中存在环,则返回到链表中环的起始节点,若是没有环,返回null。java

样例 1: node

输入:null,no cycle面试

输出:no cycle算法

解释:spa

链表为空,因此没有环存在。指针

样例 2: code

输入:-21->10->4->5,tail connects to node index 1ip

输出:10get

解释:io

最后一个节点5指向下标为1的节点,也就是10,因此环的入口为10。

题解

考点:

双指针链表判环

题解:

使用双指针判断链表中是否有环,慢指针每次走一步,快指针每次走两步,若链表中有环,则两指针一定相遇。

假设环的长度为l,环上入口距离链表头距离为a,两指针第一次相遇处距离环入口为b,则另外一段环的长度为c=l-b,因为快指针走过的距离是慢指针的两倍,则有a+l+b=2*(a+b),又有l=b+c,可得a=c,故当判断有环时(slow==fast)时,移动头指针,同时移动慢指针,两指针相遇处即为环的入口。

九章参考程序

jiuzhang.com/solution/l

算法面试高频题班免费试听,攻略更多大厂常考题型。

        
      public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null || head.next==null) {
            return null;
        }
 
        ListNode fast, slow;
        fast = head.next;    		//快指针         slow = head;				//慢指针         while (fast != slow) {		//快慢指针相遇             if(fast==null || fast.next==null)
                return null;
            fast = fast.next.next;
            slow = slow.next;
        } 
        
        while (head != slow.next) {  //同时移动head和慢指针             head = head.next;
            slow = slow.next;
        }
        return head;				//两指针相遇处即为环的入口     }
}