55 链表中环的入口结点

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

思路一: Floyd环判定算法

使用fastptr和sloeptr两个速度不相同的指针,一旦它们两个进入链表中的环,就肯定会相遇

时间复杂度O(n)

空间复杂度O(1)

错误代码:没有看清楚题目啊?不是让你判断链表是否有环,而是要让你找到环的入口节点啊

 

 1 public class Solution {
 2     public ListNode EntryNodeOfLoop(ListNode pHead){
 3         //考虑特殊情况
 4         if(pHead == null || pHead.next==null|| pHead.next.next==null) return null;
 5         //定义两个pointer
 6         ListNode fastptr = pHead;//快指针走两步
 7         ListNode slowptr = pHead;//慢指针走一步
 8         while( fastptr.next.next!=null && slowptr.next!=null){
 9             fastptr = fastptr.next.next;
10             slowptr = slowptr.next;
11             if(fastptr == slowptr) return fastptr;
12         }
13         return null;
14     }
15 }

 

正确代码: 

25行的break语句,一定要放进if的{}中去,否则无法通过

 1 /*
 2  public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 public class Solution {
12     public ListNode EntryNodeOfLoop(ListNode pHead){
13         //考虑特殊情况
14         if(pHead == null || pHead.next==null|| pHead.next.next==null) return null;
15         //定义两个pointer,和环是否存在的真假
16         ListNode fastptr = pHead;//快指针走两步
17         ListNode slowptr = pHead;//慢指针走一步
18         boolean isExist = false;
19         //判断环是否存在
20         while( fastptr.next.next!=null && slowptr.next!=null){
21             fastptr = fastptr.next.next;
22             slowptr = slowptr.next;
23             if(fastptr == slowptr){
24                 isExist = true;
25                 break;
26             }
27         }
28         if(isExist == true){//环存在,找到环的入口节点
29             slowptr = pHead; //只初始化其中一个指针,另外一个指针不动
30             while(slowptr!= fastptr){
31                 fastptr = fastptr.next; //每个指针各走一步
32                 slowptr = slowptr.next; //每个指针各走一步
33             }
34             return slowptr;
35         }
36         return null; //环不存在,返回null
37     }
38 }

 

上一篇:链表的增加和删除


下一篇:输出链表倒数第K个元素的节点值