标签:单链表交点
分析: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); }
【算法导论学习-23】两个单链表(single linked)求交点
标签:单链表交点
原文地址:http://blog.csdn.net/brillianteagle/article/details/38866699