思路一:先判断两个链表的最后一个结点是否相同,若相同,则会有结点。
两条链表难免会出现长度不一样的情况,先让长的链表先走差距步。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode*curA = headA; struct ListNode*curB = headB; int lenA = 0,lenB=0; //计算headA链表中有多少个结点 while(curA->next) { curA=curA->next; ++lenA; } while(curB->next) { curB=curB->next; ++lenB; } //如果最后一个结点相同,就说明相交 // if(curA!=curB) // { // return NULL; // } //长的先走差距步,再同时走,第一个相等就是交点 //假设法 先假设k1长k2短 int gap = abs(lenA-lenB); printf("lenA: %d, lenB: %d, gap: %d\n", lenA, lenB, gap); struct ListNode*longList=headA,*shortList=headB; //假设错了,重新校验以下 if(lenB>lenA) { longList = headB; shortList = headA; } while(gap--) { longList=longList->next; } while(shortList!=longList) { longList=longList->next; shortList=shortList->next; } return shortList; }
思路二 :先不顾两条链表的长短,先走到尾结点的链表跳到另外一个链表的头节点,这样也实现了先走差距步的效果。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *curA = headA; struct ListNode *curB = headB; while (curA != curB) { curA = curA ? curA->next : headB; curB = curB ? curB->next : headA; } return curA; }
来自力扣题解中一位大神的思路!贞徳是非常纽博伊。