题目
判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null
在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2
思路
以下是问题三的具体解决过程:
- 如果loop1==loop2,我们只需要考虑从链表1的头节点head1到loop1这一段与从链表2的头节点head2到loop2这一段中,在哪里第一次相交,这与问题二,前面一篇文章类似。
- 如果loop1!=loop2,两个链表有可能相交,也有可能不相交;不相交的情况很好理解,相交的情况就是链表一和链表二共有一个环,但是入环节点不是同一个节点。
- 为了判断当loop1!=loop2是哪一种情况,让链表1从loop1出发,如果之后没有遇到loop2并且回到loop1的话,就说明不相交,否则就是相交, 此时返回loop1和loop2都可以。
源码
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public Node bothLoop(Node head1, Node loop1, Node head2,Node loop2){
Node cur1=null;
Node cur2=null;
if(loop1==loop2){
cur1=head1;
cur2=head2;
int n=0;
while(cur1!=loop1){
n++;
cur1=cur1.next;
}
while(cur2!=loop2){
n--;
cur2=cur2.next;
}
cur1=n>0?head1:head2;
cur2=cur1==head1?head2:head1;
n=Math.abs(n);
while(n!=0){
n--;
cur1=cur1.next;
}
while(cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;
}else{
cur1=loop1.next;
while(cur1!=loop1){
if(cur1==loop1){
return loop1;
}
cur1=cur1.next;
}
return null;
}
}