面试必考真题-算法篇 牛客网
链表 双指针
题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?
题目分析
- 1)首先判断是否有环,有环时,返回相遇的节点,无环,返回null
- 2)有环的情况下,求链表的入环节点
- fast再次从头出发,每次走一步,slow从相遇点出发,每次走一步,再次相遇即为环入口点。
下面是Java代码
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head ==null){
return null;
}
ListNode fast = head;
ListNode slow = head;
ListNode meetNode = null;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(fast == slow){//快慢指针相遇,说明有环,记录相遇节点,跳出循环
meetNode = slow;
break;
}
}
//相遇节点为空,说明无环,返回null
if(meetNode == null){
return null;
}
fast = head;//fast再次从头出发
while(slow!=fast){//再次相遇即为环入口点
fast = fast.next;//fast每次走一步
slow = slow.next;//slow每次走一步
}
return slow;
}
}