环形链表
思路: 利用快慢指针,快慢指针走的时间相等,可列出公式
(X+Y)= (2Y+X+Z)/2, X=Z。所以可利用头节点和快慢指针碰撞节点,一起向后移动,相等时,则得到环的入口节点。
Y代表在圆上走过的路线,X代表直线路线,Z代表Y路程节点开始到圆和直线相交的节点剩余的路程,
题目1: 判断是不是环形链表
public boolean hasCycle(ListNode head) {
if(head ==null){
return false;
}
boolean result = false;
ListNode slow=head, fast=head;
while(slow!=null&&fast!=null&&fast.next!=null){
slow=slow.next;
fast = fast.next.next;
if(slow==fast){
result = true;
break;
}
}
return result;
}
题目2: 判断环形链表,如果是返回环形链表的相交节点。
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null) return null;
ListNode slow = head;
ListNode fast = head;
while (slow!=null&&fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if(slow==fast){
break;
}
}
if(slow==null||fast==null||fast.next==null){
return null;
}
while (head!=slow){
System.out.println(head.val);
System.out.println(slow.val);
head=head.next;
slow=slow.next;
}
return head;
}