两链表相交
1.两个有序链表的按data值从小到大连接
①.设一个虚拟节点node
②.两链表从头结点开始比较data的值
③.data值小的依次连在node后面
public static ListNade mergeTwoLists(ListNade headA,ListNade headB) {
ListNade node=new ListNade(-1);
ListNade tmp=node;
while (headA!=null&&headB!=null){
if(headA.data<headB.data){
tmp.next=headA;
headA=headA.next;
tmp=tmp.next;
}else{
tmp.next=headB;
headB=headB.next;
tmp=tmp.next;
}
}
if(headA!=null){
tmp.next=headA;
}
if (headB!=null){
tmp.next=headB;
}
return node.next;
}
2.两个链表的交点
public static ListNade getIntersectionNode(ListNade headA,ListNade headB){
if(headA == null || headB == null) {
return null;
}
//永远指向最长的单链表
ListNade pL = headA;
//永远指向最短的单链表
ListNade pS = headB;
int lenA = 0;
int lenB = 0;
//分别求长度
while (pL!=null){
pL=pL.next;
lenA++;
}
while (pS!=null){
pS=pS.next;
lenB++;
}
//求长度的差值
int len = lenA-lenB;
//如果是负数-》pL = headB; pS = headA
if(len<0){
pL=headB;
pS=headA;
len=lenB-lenA;
}else {
pL=headA;
pS=headB;
}
//只需要让pL走len步就好了
while(len>0){
pL=pL.next;
len--;
}
//走完len步之后 两个同时开始走
//一直走 走到值相同时 就是交点
while (pL!=pS && pL!=null){
pL=pL.next;
pS=pS.next;
}
if(pL==pS && pL!=null){
return pS;
}
return null;
}