您的位置:首页 > 其它

链表中环的问题

2017-04-07 17:29 190 查看

Leetcode 141. Linked List Cycle 链表是否有环

两个指针一个一步一步的走,一个两步两步的走,相遇则就是有环

public class Solution {
public boolean hasCycle(ListNode head) {
ListNode temp1 = head,temp2 = head;
while(temp1 != null){
temp2 = temp2.next;
if(temp1.next == null) return false;
temp1 = temp1.next.next;
if(temp1 == temp2) return true;
}
return false;
}
}




走两步的temp2和走一步temp1的两个指针相遇了之后,重新定义temp = head,temp走一步,temp1走一步,t他们两个相遇的时候就是环的入口,证明如下:Leetcode 142. Linked List Cycle II 找到环的入口

设temp1和temp2相遇一共走了t次,那么temp1走过的路程为t,temp2走过的路程为2t,设换长为l,则有2t-t = nl,即t= nl。设从链表头节点到链表环入口节点的长度为a,从头节点到相遇的节点的距离为d,则有t = a+d +ml(可能temp1也绕环了),根据上面的t=nl可知a+d = l(a+d只能是一倍的环长)



public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode temp1 = head,temp2 = head;
while(temp1 != null && temp1 .next != null){
temp1 = temp1.next.next;
temp2 = temp2.next;
if(temp1 == temp2){
temp1 = head;
while(temp1 != temp2){
temp1 = temp1.next;
temp2 = temp2.next;
}
return temp1;
}
}
return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: