题解 | #链表中环的入口结点#

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

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

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

// 为了保证空间复杂度o(1),不能使用哈希表

// 那么只剩下双指针,之前采用快慢指针判断出是否存在环

// 现在可以根据其长度来得出快慢指针相遇点与环的关系

// 假设从0到入口长度为x,从入口到相遇点长度为y,慢指针走了x+y,快指针走了2x+2y

// 那么我们可以得出相遇点到入口位置的长度等于0到入口的长度

public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        
        // 判断是否存在链表
        if(pHead == null){
            return null;
        }

        // 定义快慢指针
        ListNode fastNode = pHead;
        ListNode slowNode = pHead;

        // 第一次相遇
        while(fastNode != null && slowNode != null){

            // 多一重判断,为了防止fastNode下一个点为null导致错误
            if(fastNode.next == null){
                return null;
            }

            fastNode = fastNode.next.next;
            slowNode = slowNode.next;

            // 第一次相遇跳出循环,即slowNode和fastNode就是相遇点
            if(fastNode == slowNode){
                break;
            }

        }

        // 首先判断是相遇break还是链表null
        if(fastNode == null){
            return null;
        }

        // 正常移动,都1步移动,相遇点极为入口
        slowNode = pHead;
        while(fastNode != slowNode){
            slowNode = slowNode.next;
            fastNode = fastNode.next;
        }

        // 跳出循环即为相遇,输出
        return slowNode;

    }
}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务