题目描述:
1、给定一个链表,判断链表中是否有环。
解法:
快慢指针的思想,fast一次走两步,slow一次走一步,如果某一时刻fast与slow相遇,那么肯定有环。
代码实现:
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
return true;
}
}
return false;
}
}
题目描述:
2、给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回
null
。
思路和上面的一样,也是快慢指针,关键是弄明白为什么第一次相遇后,让slow重新指向head,fast与slow每次走一步,下次相遇的的地方就是环入口,关于这个问题下图做了详细的推理。
图解:
代码实现:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
break;
}
}
if(fast == null || fast.next == null){
return null;
}
slow = head;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}