问题141:判断链表是否存在环?
题目来源:力扣
解题思路:
思路1:利用hashset遍历存储,若当前带存储的节点已经存在域hashset中,则说明存在环;
思路2:快慢指针,slow每次走一步,fast每次走两步,若存在环,则快慢指针最终在环中相遇;
思路1(hashset实现)代码:
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<ListNode>();
if(head ==null || head.next==null){
return false;
}
while(head.next !=null){
set.add(head);
head =head.next;
if(set.contains(head)){
return true;
}
}
return false;
}
}
思路2(快慢指针)实现:
public class Solution {
public boolean hasCycle(ListNode head) {
if(head ==null || head.next==null){
return false;
}
ListNode slow = head;
ListNode fast = head;
while(fast !=null && fast.next !=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast) return true;
}
return false;
}
}
---------------------------------------------------------------------------------------------------------------------------------
问题142:判断链表是否存在环,并返回入环的位置?
题目来源:力扣
解题思路:
首先根据快慢指针判断链表是否存在环,若存在环,则满足下列关系:
代码实现:
public class Solution{
public ListNode detectCycle(ListNode head){
ListNode fast=head,slow=head;
while(fast !=null){
slow=slow.next;
if(fast.next!=null){
fast=fast.next.next;
}else{
return null;
}
if(fast==slow){
ListNode ptr = head;
while(ptr!=slow){ //找到入环的起点
ptr=ptr.next;
slow=slow.next;
}
return ptr;
}
}
return null;
}
}
(142解题分析图片来源:代码随想录)