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

题目描述

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

解题思路

  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;
        ListNode preHead = pHead;
        ListNode root = pHead;
        while(preHead != null){
            if(preHead.next == null) return null;
            preHead = preHead.next.next;
            root = root.next;
            if(preHead == root){
                ListNode start = root;
                int len = 1;
                start = start.next;
                while(start != root){
                    start = start.next;
                    len++;
                }
                preHead = pHead;
                root = pHead;
                while(len > 0){
                    preHead = preHead.next;
                    len--;
                }
                while(preHead != root){
                    preHead = preHead.next;
                    root = root.next;
                }
                return root;
            }
        }
        return null;
    }
}
发布了77 篇原创文章 · 获赞 1 · 访问量 5390

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/103941881