剑指-链表中环的入口结点-快慢指针/HashSet

题目描述

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

思路

两种方法,其一用双指针,一个走两步,一个走一步。确定有环并得出节点数,再走一圈就是入口。
其二,用hashset,set里面逐个加节点,遇到重复的就是入口。

代码

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    
    

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
    
    
        ListNode l = pHead, r = pHead;
        boolean flag = false;

		// 判断有环
        while(l != null && l.next != null){
    
    
            l = l.next;
            r = r.next.next;
            if( l == r){
    
    
                flag = true;
                break;
            }
        }
        if(!flag) return null;

		// 得出节点数
        int n = 1;
        r = r.next;
        while(l != r){
    
    
            r = r.next;
            n++;
        }
		
		// r先走n个,l开始走,碰到就是入口
        l = r = pHead;
        for(int i=0; i<n; i++){
    
    
            r = r.next;
        }
        while(l!=r){
    
    
            l = l.next;
            r = r.next;
        }
        return l;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32301683/article/details/108608667