题目描述
输入两个链表,找出它们的第一个公共结点。
解:
如果有公共节点,那么后面的节点数和节点都完全一样。如果没有公共节点,那么公共节点就是NULL。
所以链表长度较长的那一个,表头指针先走两个链表长度差值的步数,然后两个指针再共同走。如果有公共节点,那么该方法一定成立。
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1 = GetLength(pHead1);
int len2 = GetLength(pHead2);
if(len1 > len2)
{
for(int i = 0; i < len1 - len2; i++)
{
pHead1 = pHead1 ->next;
}
}
else if(len2 > len1)
{
for(int i = 0; i < len2 - len1; i++)
{
pHead2 = pHead2 ->next;
}
}
while(pHead1)
{
if(pHead1 == pHead2)
return pHead1;
pHead1 = pHead1 ->next;
pHead2 = pHead2 ->next;
}
return pHead1;
}
int GetLength(ListNode* head)
{
int cnt = 0;
while(head)
{
cnt++;
head = head ->next;
}
return cnt;
}
};