链表中环的入口节点
题目描述
| 给一个链表,若其中包含环,请找出该链表的环的入口节点,否则,输出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;
}
}
补充