链表问题11——两个单链表相交的系列问题(三):判断两个有环链表是否相交

题目

判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null

在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2


思路

以下是问题三的具体解决过程:

  1. 如果loop1==loop2,我们只需要考虑从链表1的头节点head1到loop1这一段与从链表2的头节点head2到loop2这一段中,在哪里第一次相交,这与问题二,前面一篇文章类似。
  2. 如果loop1!=loop2,两个链表有可能相交,也有可能不相交;不相交的情况很好理解,相交的情况就是链表一和链表二共有一个环,但是入环节点不是同一个节点。
  3. 为了判断当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;
	}
}
发布了43 篇原创文章 · 获赞 21 · 访问量 4859

猜你喜欢

转载自blog.csdn.net/flying_1314/article/details/103934206