【题目】
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
【思路】
方法一:
我们可以把两个链表拼接起来,一个是pHead1在前pHead2在后,另一个是pHead2在前pHead1在后。这样,生成了两个相同长度的链表,那么我们只要同时遍历这两个表,就一定能找到公共结点。
方法二:
我们也可以先让把长的链表的头砍掉,让两个链表长度相同,这样,同时遍历也能找到公共结点。
【代码】
方法一(C++)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL){
return NULL;
}
ListNode* tmp1 = pHead1;
ListNode* tmp2 = pHead2;
while(pHead1 != pHead2){
pHead1 = pHead1 != NULL ? pHead1->next : tmp2;
pHead2 = pHead2 != NULL ? pHead2->next : tmp1;
}
return pHead1;
}
};
方法二(C++)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL){
return NULL;
}
int len1 = getListLength(pHead1);
int len2 = getListLength(pHead2);
ListNode* listLong = pHead1;
ListNode* listShort = pHead2;
int dif = 0;
if(len1 > len2){
listLong = pHead1;
listShort = pHead2;
dif = len1-len2;
}else{
listLong = pHead2;
listShort = pHead1;
dif = len2-len1;
}
while(dif--){
listLong = listLong->next;
}
while(listLong != listShort){
listLong = listLong->next;
listShort = listShort->next;
}
return listLong;
}
private:
int getListLength(ListNode* list){
int length = 0;
while(list != NULL){
list = list->next;
length++;
}
return length;
}
};