输入两个链表,找出它们的第一个公共结点。

时间:2021-02-14 11:00:44

剑指offer:输入两个链表,找出它们的第一个公共结点。

思路:如果两个链表有公共节点,那么它们在第一个公共节点以后的节点都相同。

1)分别求出两个链表的长度length1和length2;

2)求出两个链表长度差dif;

3)让长的链表先从头往后先走dif步

4)连个链表同时走,直到指针相同为止,返回当前指针。

5)如果两链表走到头也地址不相同,则返回NULL

代码如下:

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
unsigned int GetListLength(ListNode* pHead){
unsigned int length = 0;
ListNode* pNode = pHead;
while(pNode != NULL){
length++;
pNode = pNode->next;
}

return length;
}
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL)
return NULL;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
unsigned int length1 = GetListLength(p1);
unsigned int length2 = GetListLength(p2);

if(length1 > length2){
while((length1--) > length2){
p1 = p1->next;
}
}

else if(length2 > length1){//注意这里一定是else if,用if会出错,因为前面length1--导致的
while((length2--) > length1){
p2 = p2->next;
}
}

while(p1 != NULL && p2 != NULL){
if(p1 == p2)
return p1;
else{
p1 = p1->next;
p2 = p2->next;
}
}

return NULL;

}
};