一、题目
输入两个链表,找出它们的第一个公共节点。
二、解法
思路:假设链表1比链表2长。 则从两个链表的头结点开始遍历,前提是先让较长的链表前进(length1-length2)个节点,然后同时开始遍历,它们可以同时到达第一个公共节点。
/*
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!=nullptr)
{
++length;
pNode = pNode->next;
}
return length;
}
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
unsigned int length1 = GetListLength(pHead1);
unsigned int length2 = GetListLength(pHead2);
int dist = length1 - length2;
ListNode* pListHeadLong = pHead1;
ListNode* pListHeadShort = pHead2;
if(length2>length1)
{
pListHeadLong = pHead2;
pListHeadShort = pHead1;
dist = length2-length1;
}
for(int i=0; i<dist; ++i)
pListHeadLong = pListHeadLong->next;
while(pListHeadLong!=nullptr && pListHeadShort!=nullptr && pListHeadLong!=pListHeadShort)
{
pListHeadLong = pListHeadLong->next;
pListHeadShort = pListHeadShort->next;
}
return pListHeadLong;
}
};