查找链表相交节点
先判断链表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 || !headB) return NULL;
ListNode *pa = headA;
ListNode *pb = headB;

这篇博客探讨了如何查找相交链表的节点,包括无环链表相交、链表相交于入环前及入环节点、以及链表在入环后相交或不相交的情况。通过判断链表是否有环并找到环的入口,利用双指针同步前进的方法确定相交节点。代码实现详细说明了不同情况下的处理策略。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



