两个链表的第一个公共节点
就是剑指offer面试题52,两个链表的第一个公共节点
所谓公共节点大概就是这样了,因为一个链表只能有一个后继
如果两个节点恰好在末尾,如果两个链表的节点在第一个位置,那就是一条链表了
对两个链表从头到尾进行遍历都没有相同的位置,那么肯定就没有公共的节点
看书上说,也可以用两个辅助栈来实现:
把第一个链表放进栈里
把第二个链表放进栈里
然后再弹出(也就是从两个链表的结尾开始弹,如果两条链表相交,则两链表至少有一个节点相同),直到节点不一致,那么就是到了分叉口。
这里我没有用两个辅助栈的做法,而是从两个链表的头开始,让长的链表的指针先跑(跑的距离就是长短链表的长度差值),这样两链表同时进行遍历,如果有相同节点则是第一个节点
代码:
public class Main {
public Node getPublicNode(Node head1,Node head2){
if(head1==null||head2==null){
return null;
}
/**
* length1 : head1的长度
* length2 : head2的长度
* flag : 长度的链表比短的链表的差值
*/
int length1=0;
int length2=0;
for(Node phead=head1;phead!=null;phead=phead.next){
length1++;
}
for(Node phead=head2;phead!=null;phead=phead.next){
length2++;
}
int flag=length1>length2?length1-length2:length2-length1;
Node p1=head1,p2=head2;
//让短的那个链表先走flag个长度
for(int i=0;i<flag;i++){
if(length1>length2){
p1=p1.next;
}else if(length2>length1){
p2=p2.next;
}
}
//这下两条链表两个指针初始的位置相同,可以进行遍历
while((p1!=null)&&(p1!=p2)&&(p2!=null)){
p1=p1.next;
p2=p2.next;
}
//相等的时候就是交点了
return p1;
}
}
class Node{
int data;
Node next;
}