问题描述:
输入两个链表,找出它们的第一个公共结点。
本题的思路很简单,首先我们考虑一种特殊的相交链表,如下图所示:
两个相交的链表长度相同,想要找到第一个公共的节点很简单,维护两个指针,从2个链表头开始,逐个节点遍历对比,相同时就找到了第一个公共交点。
扩展为复杂的情况,两个链表长度不同时:
这种情况就可以先得到两个链表的长度,然后同样维护两个指针指向头节点,此时先需要根据两个链表的长度,将长的指针向后移动长度之差的节点,此时就变为了上面简单的情况。
解题代码:
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
if(pHead1==nullptr || pHead2==nullptr)
return nullptr;
//求链表长度
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
//将长的链表头节点移动到和短的一样长
if(length1>length2){
for(int i=0;i<length1-length2;i++){
pHead1 = pHead1->next;
}
}
if(length1<length2){
for(int i=0;i<length2-length1;i++){
pHead2 = pHead2->next;
}
}
//一起向后遍历链表,相同时返回结果
while(pHead1 && pHead2){
if(pHead1==pHead2)
return pHead1;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return nullptr;
}
int getLength(ListNode *pHead){
int res=0;
while(pHead!=nullptr){
res++;
pHead = pHead->next;
}
return res;
}
};