有环链表相交,首先两链表都要有环,一个有环一个无环不可能相交。
有环链表相交有三种情况
则只需要判断是否共有一个环就行。
思路:分别取两链表上两个环内结点node1和node2,然后让node1遍历,如果与node2相遇,则代表位于一个环,反之,则不想交。
//求环中相遇结点
public Node cycleNode(Node head){
//链表为空则返回null
if(head == null)
return null;
Node first = head;
Node second = head;
while(first != null && first.next != null){
first = first.next.next;
second = second.next;
//两指针相遇,则返回相遇的结点
if(first == second)
return first;
}
//链表无环,则返回null
return null;
}
public boolean isIntersectWithCycle(Node head1,Node head2){
//node1和node2保存环上的一点
Node node1 = cycleNode(head1);
Node node2 = cycleNode(head2);
//如果不存在环上的一点,则代表无环
if(node1 == null || node2 == null)
return false;
if(node1 == node2)
return true;
Node current = node1.next;
while(current != node1){
//若current与node2相遇,则代表两链表共享一个环即相交
if(current == node2)
return true;
current = current.next;
}
return false;
}