问题重述:
题目:输入两个链表,找出它们额第一个公共结点。
思路接下:
我们假设,如果两个链表中有相同的结点(公共结点),那么从公共结点之后(包括公共结点),两个链表是一模一样的。因此可以这样。先求出两个链表的长度,然后将长的链表遍历到和短的链表一样长的地方,然后同时向后遍历并进行比较,那么第一次相等的地方就是两个链表的第一个公共结点。
代码实现:
/*
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==nullptr||pHead2==nullptr)
return nullptr;
ListNode *l = nullptr;
ListNode *s = nullptr;
int len1 = getLen(pHead1);
int len2 = getLen(pHead2);
if(len1>len2)
{
l = pHead1;
s = pHead2;
}
else
{
l = pHead2;
s = pHead1;
}
int j = 0;
while(j<abs(len1-len2))
{
l = l->next;
++j;
}
while(l)
{
if(l == s)
return l;
l = l->next;
s = s->next;
}
return nullptr;
}
int getLen(ListNode * heap)
{
ListNode *p = heap;
int len = 0;
while(p!=nullptr)
{
++len;
p=p->next;
}
return len;
}
};