题目描述
输入两个链表,找出它们的第一个公共结点。
解法:
一、暴力法,第一个链表从开头遍历,和第二个链表的每个节点元素比较,则需要两个for嵌套循环,那么复杂度是o(mn)
二、低复杂度法,最长的链表先行遍历,然后再同时遍历比较相等的节点。复杂度为o(n+m)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
unsigned int len1 = getListNode(pHead1);
unsigned int len2 = getListNode(pHead2);
int lenDiff = len1 - len2;;
ListNode* pHeadLong = pHead1;
ListNode* pHeadShort = pHead2;
if(len1 < len2) {
pHeadLong = pHead2;
pHeadShort = pHead1;
lenDiff = len2 - len1;
}
for(int i = 0; i < lenDiff; ++i){
pHeadLong = pHeadLong->next;
}
while(pHeadLong && pHeadShort && pHeadLong != pHeadShort) {
pHeadLong = pHeadLong->next;
pHeadShort = pHeadShort->next;
}
ListNode* firstCom = pHeadLong;
return firstCom;
}
unsigned int getListNode(ListNode* pHead) {
ListNode* p = pHead;
unsigned int len = 0;
while(p) {
++len;
p = p->next;
}
return len;
}
};