第55题——链表中环的入口节点

842 阅读1分钟

题目:

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路:

创建slow和fast两个指针,slow每次走一步,fast每次走两步,若链表中有环slow和fast一定会相遇。那时,slow走的步数=x+P*L+s,fast走的步数=x+Q*L+s,其中x表示从头节点到环入口的节点数,L为环的长度,P和Q是整数,s表示最后相遇这一圈在环中走的步数。那么fast走的步数-slow走的步数=(Q-P)L=slow走的步数,因此它们相遇时slow走的步数是环长度的整数倍,那么x+s=L。把slow重新置到pHead,fast和slow同时走,只不过这时都走一步,那么slow走x步就会与fast相遇与环的入口。

Java

package nowcoder;

/**
 * @author LiuZhiguo
 * @date 2020/2/13 21:35
 */
public class S55_MeetingNode {
    public ListNode meetingNode(ListNode pHead){
        if (pHead == null || pHead.next == null)
            return null;
        ListNode slow = pHead;
        ListNode fast = pHead;
        while (slow != null && fast != null){
            slow = slow.next; //走一步
            fast = fast.next.next; //走两步
            if (slow == fast)
                break;
        }
        slow = pHead;
        while (slow != fast){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
}