给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
首先最容易想到暴力搜寻,对A链的每一个节点,都对B链表进行遍历搜索看是否相同
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode nA= headA;
while(headA!=null){
ListNode nB = headB;
while(nB!=null){
if(nA==nB){
return nA;
}
nB = nB.next;
}
nA= nA.next;
}
return null;
}
这种就不分析了
然后再思考
如果先把A链表遍历一次,节点存到容器中。
遍历B链表时,看B链表节点在不在容器,如果存在,就相交。
这也是一种把办法。
再思考,画图,
分析:单链表,如果相交,之后节点一样
-
那么A链表头到节点长度a
-
B链表头到节点长度b
-
如果相交一定存在a+b=b+a;
-
所以,当A节点不等于B节点时,一直往后找,A到头切到B,B到头切到A,如果相交,一定会遇到;
如果A和B不相交,一定会走到底部,此时nAnull,nBnull,退出循环
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null) {
return null;
}
ListNode nA=headA,nB = headB;
while (nA!=nB) {
nA = nA==null?headB:nA.next;
nB = nB==null?headA:nB.next;
}
return nA;
}
菜鸡学习记录,供后续复习。