剑指offer系列29-----链表中环的入口节点-

【题目】一个链表中包含环,请找出该链表的环的入口结点。

【思路】方法一:使用双指针

   方法二:利用set集合的特性,不能添加重复数字,否则返回false
 1 package com.exe7.offer;
 2 
 3 /**
 4  * 【题目】一个链表中包含环,请找出该链表的环的入口结点。
 5  * @author WGS
 6  *
 7  */
 8 public class EntryNodeOfLoop {
 9 
10     
11     class LinkNode{
12         int val;
13         LinkNode next=null;
14         public LinkNode(int val){
15             this.val=val;
16         }
17     }
18     //得到闭环中任一相遇结点
19     public LinkNode getMeetingNode(LinkNode headNode){
20         if(headNode==null) return null;
21         LinkNode slowNode=headNode;
22         LinkNode fastNode=slowNode.next;
23         
24         while(slowNode!=null && fastNode!=null){
25             if(slowNode==fastNode)
26                 return fastNode;
27             slowNode=slowNode.next;
28             fastNode=fastNode.next;
29             if(fastNode!=null)
30                 fastNode=fastNode.next;
31         }    
32         return null;
33         
34     }
35     public LinkNode getNodeOfLoop(LinkNode headNode){
36         if(headNode==null) return null;
37         
38         LinkNode meetingNode=getMeetingNode(headNode);
39         if(meetingNode==null)
40             return null;
41         //1 首先根据得到的闭环中得到的结点确定闭环中结点的总共数目
42         int numOfLoop=1;
43         LinkNode pNode1=meetingNode.next;
44         while(pNode1!=meetingNode){
45             pNode1=pNode1.next;
46             numOfLoop++;//得到闭环节点数目
47         }
48         
49         //2 根据双指针确定入环结点
50         pNode1=headNode;
51         for(int i=0;i<numOfLoop;i++){
52             pNode1=pNode1.next;
53         }
54         LinkNode pNode2=headNode;
55         while(pNode1!=pNode2){
56             pNode1=pNode1.next;
57             pNode2=pNode2.next;
58         }
59         return pNode1;
60         
61     } 
62     public static void main(String[] args) {
63         // TODO Auto-generated method stub
64 
65     }
66 
67 }
 1 /**
 2      * 方法二:利用set集合的特性,不能添加重复数字,否则返回false
 3      * @param args
 4      */
 5     public LinkNode EntryNodeOfLoop(LinkNode headNode){
 6         Set<LinkNode>  set=new HashSet<>();
 7         while(headNode!=null && set.add(headNode)){
 8             headNode=headNode.next;
 9         }
10         
11         return headNode;
12         
13     }
原文地址:https://www.cnblogs.com/noaman/p/5566705.html