题目描述
输入两个链表,找出它们的第一个公共结点。
思路
分析可得公共结点应该在尾结点附近,第一个公共结点之后,结点都相同。
1. 最直接思路,遍历第一个链表,查看是否是第一个公共结点,依次到链表结束,复杂度O(M*N)。M和N分别是两个链表的长度。
2. 使用两个栈存储两个链表的遍历结点,然后比较栈顶,如果相同则弹出,遇到不同结点,则上一个弹出结点即为第一个公共结点。代价是O(M+N)空间复杂度。
3. 由思路二扩展得到,可以先获取到两个链表的长度,然后尾对齐之后,一起遍历。比如tmp=M-N,M>N 则长度大的链表先走tmp步,然后两个链表一起走,遇到第一个相同结点,则为公共结点。相当于不同起点,同一终点,然后设置成相同位置起点。
code
/*
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 pHead1Length=0;
int pHead2Length=0;
ListNode* pNode1=pHead1;
ListNode* pNode2=pHead2;
while(pNode1)
{
pHead1Length++;
pNode1=pNode1->next;
}
while(pNode2)
{
pHead2Length++;
pNode2=pNode2->next;
}
pNode1=pHead1;
pNode2=pHead2;
if(pHead1Length>pHead2Length)
{
int i=pHead1Length-pHead2Length;
while(i)
{
pNode1=pNode1->next;
i--;
}
}else{
int i=pHead2Length-pHead1Length;
while(i)
{
pNode2=pNode2->next;
i--;
}
}
while(pNode2&&pNode1&&pNode2!=pNode1)
{
pNode1=pNode1->next;
pNode2=pNode2->next;
}
return pNode1;
}
};