leetcode-剑指 Offer 52. 两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
解题思路:
从示例1的附图可以发现:交点并不是数值相等的点,而是指针相等的点。
双指针分别遍历链表A,链表B,当一个链表遍历结束后,他的指针指向另一个链表的头结点,最终会在某一个节点处相遇。
举个例子:
A路程为: L1+C;
B路程为:L2+C;
其中C代表公共的部分
当两个人都走过L1+L2+C时,也就是走过的路程相同,会相遇。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL) return NULL;
ListNode * p=headA;
ListNode * q=headB;
while(p!=q)
{
p=p->next;
q=q->next;
if(p==NULL&&q!=NULL) p=headB;
if(p!=NULL&&q==NULL) q=headA;
}
return p;
}
};
此题还有另外一种做法:让长度长的链表先走|A链表长度-B链表长度|的距离,然后两个链表再同时走,知道找到相等的位置,返回结果。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pA = headA;
ListNode* pB = headB;
int lenA = 0, lenB = 0;
while (pA != NULL) { // 求链表A的长度
lenA++;
pA = pA->next;
}
while (pB != NULL) { // 求链表B的长度
lenB++;
pB = pB->next;
}
pA = headA;
pB = headB;
//保证pA为长链表,lenA为其长度
if (lenB > lenA) {
swap (lenA, lenB);
swap (pA, pB);
}
int x = lenA - lenB; // 求两个链表距离的差值
while (x--) {
pA =pA->next;
}
while (pA != NULL) {
if (pA!= pB) {
pA = pA->next;
pB =pB->next;
}
else
return pA;
}
return NULL;
}
};