问题:A、B两个单链表如果有交点,返回第一个交点在A中的位置(链表头结点位置为0)。
分析:A、B如果有交点,交点的后继一定也是交点,所以一定是Y型相交,所以算法的思想如下
1) 求得A、B的长度,比如ALength,Blength
2) 判断ALength,Blength谁大,比如Alength>Blength
3) Alength移动到Alength-Blength的位置,开始判断每个节点是否相等,相等则退出。
以本博客中“【算法导论学习-20】单链表(single linked)的实现”为单链表类,Java实现:
/*返回结点在A链表中的位置,注意,链表首结点位置为0*/
public static Integer getPositionofFirstIntersectionNode(SinglyLinkedList<Integer> A,SinglyLinkedList<Integer> B) {
int lenghtofA=A.getLength();
int lengthofB=B.getLength();
int counter=-1;
/*获得头指针*/
Node<Integer> nodeofA=A.getPreHead();
Node<Integer> nodedofB=B.getPreHead();
/*将两个链表对齐*/
if (lenghtofA!=lengthofB) {
while (lenghtofA>lengthofB) {
nodeofA= nodeofA.getNext();
lenghtofA--;
counter++;
}
while (lenghtofA<lengthofB) {
nodedofB=nodedofB.getNext();
lenghtofA--;
}
}
/*对齐后判断每个结点是否相等*/
while (nodeofA!=null&&nodedofB!=null) {
if (nodeofA.equals(nodedofB)) {
break;
}else {
nodeofA= nodeofA.getNext();
nodedofB=nodedofB.getNext();
counter++;
}
}
return counter;
}
******************************************************************
测试:public static void main(String[] args) {
// TODO 自动生成的方法存根
SinglyLinkedList<Integer> singlyLinkedListA = new SinglyLinkedList<>();
SinglyLinkedList<Integer> singlyLinkedListB = new SinglyLinkedList<>();
Node<Integer> node1=new Node<Integer>(-1);
Node<Integer> node2=new Node<Integer>(1);
Node<Integer> node3=new Node<Integer>(2);
Node<Integer> node4=new Node<Integer>(0);
Node<Integer> node5=new Node<Integer>(3);
Node<Integer> node6=new Node<Integer>(4);
Node<Integer> node7=new Node<Integer>(5);
singlyLinkedListA.add(node1);
singlyLinkedListA.add(node2);
singlyLinkedListA.add(node3);
singlyLinkedListA.add(node5);
singlyLinkedListA.add(node6);
singlyLinkedListA.add(node7);
singlyLinkedListB.add(node4);
singlyLinkedListB.add(node5);
singlyLinkedListB.add(node6);
singlyLinkedListB.add(node7);
int positon=getPositionofFirstIntersectionNode(singlyLinkedListA, singlyLinkedListB);
System.out.println(positon);
}