【剑指offer】链表中环的入口结点

链表中环的入口结点

http://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4

看到这题时,无从下手...
再看书时,书上逻辑思维真的太棒了,想问题的思路很nice!

思路:1.判断链表中有环 -> 2.得到环中节点的数目 -> 3.找到环中的入口节点

/*
 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){
            return null;
        }
        // 1.判断链表中有环
        ListNode l=pHead,r=pHead;
        boolean flag = false;
        while(r != null && r.next!=null){
            l=l.next;
            r=r.next.next;
            if(l==r){
                flag=true;
                break;
            }
        }
        if(!flag){
            return null;
        }else{
            // 2.得到环中节点的数目
            int n=1;
            r=r.next;
            while(l!=r){
                r=r.next;
                n++;
            }
            // 3.找到环中的入口节点
            l=r=pHead;
            for(int i=0;i<n;i++){
                r=r.next;
            }
            while(l!=r){
                l=l.next;
                r=r.next;
            }
            return l;
        }

    }
}
全部评论
还是书上的解法最简单易懂,逻辑太棒了
2 回复 分享
发布于 2020-03-24 21:56
逻辑思维真的太棒了,想问题的思路很nice!
2 回复 分享
发布于 2019-10-04 19:41
nb这个思路我懂了
点赞 回复 分享
发布于 2022-02-19 03:05
就是神奇,自己写的就超时,复制的就能通过。明明一模一样阿
点赞 回复 分享
发布于 2021-10-18 21:19
这个运行循环超时了
点赞 回复 分享
发布于 2021-10-04 16:07
快慢指针 相遇点一定在环内部(如果有环)。 然后就可以判断环的节点数。 之后,两个指针指向头部, 先让一个指针走 一个环的距离, 等两个指针再次相遇的时候, 就是环的入口点。
点赞 回复 分享
发布于 2021-09-22 14:15
您好,请问您看的是什么书?
点赞 回复 分享
发布于 2021-07-24 17:48
这个思路绝了,快慢指针找到相遇点。测量出环的长度。两个慢指针,一个提前一个环,首次相遇必定是环的入口
点赞 回复 分享
发布于 2021-07-07 09:15
在while的条件判断中对于条件 r.next != null ,在第二次循环当 r=null 时会造成空指针异常,少了一个判断
点赞 回复 分享
发布于 2021-03-24 20:57
还是这个清楚,第三步找环的入口结点的时候,先让r指针跑环结点大小n次,相当于把环从链表中剪掉。害,太菜了,还是只能想到用hashset存地址判断出重复这种方法,更别说能想到其他回答中的计算公式啥的了。
点赞 回复 分享
发布于 2021-03-04 16:10
ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode* r=pHead; ListNode* next=pHead->next; while(next) { if(next <r>next; next=next->next; } } return NULL; } 为什么我的很简单复杂度O(n)</r>
点赞 回复 分享
发布于 2020-04-22 12:40

相关推荐

06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
评论
54
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务