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

链表中环的入口结点

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

快慢指针解法,快指针走两步慢指针走一步
当两针相遇时,快指针移动2k步,慢指针移动k步
即指针走k步回移动到相遇点。
设相遇点到环头位置距离m
即第三个指针从头移动k-m次就会移动到环头
又应为现在相遇的指针相等于在环头多走了m步,
所以同时相同速度移动新旧指针,当移动k-m步相遇,这时的相遇点就是环头

public ListNode EntryNodeOfLoop(ListNode pHead) {
        //解法2,快慢指针

        ListNode fast = pHead;
        ListNode slow = pHead;
        int stepF = 0;
        int stepS = 0;
        while (fast!=null&&slow!=null){
            if(stepF>stepS&&fast==slow){
                break;
            }
            fast = fast.next;
            if(fast!=null) {
                fast=fast.next;
                stepF+=2;
            }else {
                return null;
            }
            slow=slow.next;
            stepS++;
        }
        if(fast==null||slow==null) return null;
        //再走k-m步就会再次相遇
        fast=pHead;
        while (fast!=slow){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
全部评论

相关推荐

accaacc:2到4k,不是2k到4k,所以年薪是30块
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务