查找链表相交节点
先判断链表A和B是否有环,并分别找到他们的环入口(loopA,loopB),具体方法可以参考我的上一篇博客判断链表中是否有环,并查找链表环入口。
可能有以下几种情况:
1. (loopA == NULL && loopB == NULL);链表A、B均无环;
2. ((!loopA && loopB) || (loopA && !loopB));链表A、B中有一个有环,有一个无环,这种情况A、B必定不相交;
3. (loopA == loopB && loopA);链表A、B相交于入环前或入环节点
4. (loopA != loopB && loopA && loopB);链表A、B相交于入环后(不包括入环节点),或不相交
情况1: 无环链表相交
指针pA指向链表A头节点(A1),pB指向链表B节点(B1),pA,pB均每次前进一步。当pA到达链表A尾部,令pA指向B1;同样,pB到达链表B尾部,令pB指向A1。当pA等于pB时,即为A,B相交节点。
pA经过的节点为: A1->A2->C1->C2->B1->B2->B3->C1
pB经过的节点为: B1->B2->B3->C1->C2->A1->A2->C1
将A,B链表中的节点分为3个部分:
1. 链表A独立节点;
2. 链表B的独立节点;
3. 链表A、B的共同部分;
由上可知,pA、pB指针在第二次到达链表A、B链表相交节点时,必定分别遍历一次链表中第1,2,3部分,所以此时pA、pB必定同时到达相交节点(即pA==pB)。
链表没有相交时,可以认为相交于尾节点后一个节点(NULL)。
代码如下:
// 返回链表相交节点,若没有相交返回NULL
// 不考虑链表中存在环路的情况
ListNode *getIntersectionNodeNoLoop(ListNode *headA, ListNode *headB) {
if(!headA