题目:输入两个链表,找出它们的第一个公共结点。
方法一:1.遍历两个链表,长度分布为m和n (m>n)
2.让长的先走(m-n)步,
3. 两链表同时同速开始遍历,当元素相同时,即为第一个公共节点。
代码:
/*
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 m=0,n=0;
ListNode* p1=pHead1;
ListNode* p2=pHead2;
while(p1!=NULL)
{
p1=p1->next;
m++;
}
while(p2!=NULL)
{
p2=p2->next;
n++;
}
if(m>=n)
{
p1=pHead1;
p2=pHead2;
}
else
{ p1=pHead2;
p2=pHead1;}
for(int i=0;i<m-n;i++)
p1=p1->next;
while(p1->val!=p2->val&&p1!=NULL&&p2!=NULL) //一定要加上后面两个条件
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
};
思路2:两个链表的公共节点都出现在链表的尾部,从两个链表的尾部开始比较,最后一个相同的节点就是我们想要的第一个公共节点。
1.定义两个辅助栈 ,将两个链表分别入栈
2.比较两个链表的出栈元素,最后一个相同元素即为所求。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL||pHead2==NULL)
return NULL;
stack<ListNode*> sta1;
stack<ListNode*> sta2;
while(pHead1!=NULL)
{
sta1.push(pHead1);
pHead1=pHead1->next;
}
while(pHead2!=NULL)
{
sta2.push(pHead2);
pHead2=pHead2->next;
}
ListNode* temp=NULL;
while(!sta1.empty()&&!sta2.empty())
{ if(sta1.top()==sta2.top())
{
temp=sta1.top();
sta1.pop();
sta2.pop();
}
else
{
if(temp)
return temp;
else
return NULL;
}
}
return temp?temp:NULL;
}
};