- 问题描述
判断两个链表是否相交,相交则返回第一个相交节点,不相交则返回空。 - 解决方案
首先判断两个链表是否有环,1.若均无环,则是两个无环链表的相交问题。首先判断尾结点是否相同,尾结点相同则相交,不相同则不相交。查找相交节点可以用哈希表或者计数的方法2.若均有环,则有两种相交情况,环外相交,转化为无环链表相交问题,若环内相交,则在环内判断,以其中一个环的入环节点往下走,看能否遇到另一个环的入环节点,不能则返回空;3.一个有环,一个无环,则肯定不相交。代码如下:
/**
* 判断两个链表是否相交,相交则返回第一个相交节点,不相交则返回空
* @param head1
* @param head2
* @return
*/
public static Node isIntersect(Node head1,Node head2){
Node loopNode1 = isLoop(head1);
Node loopNode2 = isLoop(head2);
//都无环
if(loopNode1 == null && loopNode2 == null){
HashSet<Node> set = new HashSet<>();
Node node = head1;
while(node != null){
set.add(node);
node = node.next;
}
node = head2;
while(!set.contains(node) && node != null){
node = node.next;
}
return node;
}
//都有环
else if(loopNode1 != null && loopNode2 != null){
if(loopNode1 == loopNode2){
int count1 = 0;
Node cur = head1;
while(cur != loopNode1){
count1 ++;
cur = cur.next;
}
cur = head2;
int count2 = 0;
while(cur != loopNode2){
count2 ++;
cur = cur.next;
}
Node cur1 = head1;
Node cur2 = head2;
if(count1 > count2){
int count3 = count1 - count2;
while (count3 > 0){
cur1 = cur1.next;
count3 --;
}
while(cur1 != cur2){
cur1 = cur1.next;
cur2 = cur2.next;
}
return cur1;
}
else{
int count3 = count2 - count1;
while (count3 > 0){
cur2 = cur2.next;
count3 --;
}
while(cur1 != cur2){
cur1 = cur1.next;
cur2 = cur2.next;
}
return cur1;
}
}
else{
Node cur1 = loopNode1.next;
while(cur1 != loopNode1){
if(cur1 == loopNode2)
return loopNode1;
cur1 = cur1.next;
}
}
}
return null;
}