剑指offer15-链表中环的入口节点

188 阅读1分钟

链表中环的入口节点

题目描述

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

思路

  • 设置快指针fast和慢指针slow,每次分别各走2步、1步,如果链表中有环,它们最终会相遇(追及问题),设相遇于hotel;
  • 如果指针p1和p2分别从头节点pHead和相遇点hotel开始走,一次都只走一步,最后p1和p2相遇于链表环入口。
程序(java)
    /**
     * code1
     * 时间复杂度:O(n),空间复杂度:O(1)
     */
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            return null;
        }
        ListNode slow = pHead;
        ListNode fast = pHead;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                fast = pHead;
                while (fast != slow) {
                    fast = fast.next;
                    slow = slow.next;
                }
                return slow;
            }
        }
        return null;
    }
}
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
    /**
     * code1
     * 复杂
     * 时间复杂度:O(),空间复杂度:O(1)
     */
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead){
        if(pHead==null){
            return null;
        }
        ListNode fast=pHead;
        ListNode slow=pHead;
        int count=1;
        while(true){
            fast=fast.next;
            if(fast==null){
                return null;
            }
            slow=slow.next;
            fast=fast.next;
            if(fast==null){
                return null;
            }
            if(slow==fast){
                break;
            }
        }
        ListNode temp=slow.next;
        while(temp!=slow){
            temp=temp.next;
            count++;
        }
        fast=pHead;
        slow=pHead;
        while(count--!=0){
            fast=fast.next;
        }
        while(fast!=slow){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }
}

补充

  • 并不需要得到链表环的节点数,当到达一些特殊点时,可以重置指针(交叉。。。)。走的快的可以走的长一点,可以发挥更多的作用。
  • 数学问题、数学关系。
  • 剑指offer14-两个链表的第一个公共节点