JZ55-链表中环的入口结点

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey

public static ListNode enterNodeOfLoop(ListNode pHead) {
        if (pHead == null || pHead.next == null) {  //链表为空,或只有一个节点
            return null;
        }

        if (pHead.next == pHead) {  //第一个节点就是环
            return pHead;
        }
        HashSet<ListNode> set = new HashSet();
        ListNode pCut = pHead;
        while (pCut != null) {
            if (set.contains(pCut)) {
                return pCut;
            }
            set.add(pCut);
            pCut = pCut.next;
        }
        return null;
    }

    /**
     * 快慢指针  show当前,fast当前的下一个,差1个位置(也可以不差,在同一个起始位置)
     *         show每次一格,fast每次两格。则n-1(n)次后,fast比show多走一圈
     *         还要输出对应的头节点,  数学公式
     *         碰头后,快指针返回头节点,然后同步,再次相遇就是环的开始节点
     */

    public static ListNode enterNodeOfLoop2(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            return null;
        }

        if (pHead.next == pHead) {  //第一个节点就是环
            return pHead;
        }

        ListNode show = pHead;
        ListNode fast = pHead;

        while (fast != null && fast.next != null) {
            show = show.next;
            fast = fast.next.next;
            if (show == fast) {  //有环的情况下
                fast = pHead;
                while (fast != show) {  //可能第一个输入的不是环的入口 9-1-2-3-4-5-3-4-5-3-4-5
                    show = show.next;
                    fast = fast.next;
                }
                return show;
            }
        }
        return null;
    }

全部评论

相关推荐

想申请延毕了,找工作找到崩溃,越找就越想摆烂,还有25届的和我一样感受吗?
码农索隆:没事哒,好兄弟,慢慢来,调整心态,车到山前必有路,感到迷茫的时候,多抬头看看
点赞 评论 收藏
分享
LemontreeN:有的兄弟有的我今天一天面了五场,4个二面一个hr面
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务