输入两个链表,找出它们的第一个公共结点。
思路:利用栈
相当于Y型链表
4 5结点的地址是相同的所以,3的next和0的next相同
首先利用栈将两个链表的节点压入栈,然后分别pop栈,直到如果栈顶元素不相同,及当stack1 = 3的节点时,stack2=0时的节点,此刻我们返回栈顶元素的下一个,就是链表的第一个公共点节点地址。
如果没有if(pHead1 == pHead2) return pHead1;这一句代码执行是不成功的
我猜是有大量数据导致栈溢出。
/*
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;
}
if(pHead1 == pHead2) return pHead1;
stack<ListNode* > s1;
stack<ListNode* > s2;
while(pHead1 != NULL )
{
s1.push(pHead1);
pHead1=pHead1->next;
}
while(pHead2 != NULL )
{
s2.push(pHead2);
pHead2=pHead2->next;
}
if(s1.top() != s2.top())
{
return NULL;
}
while(s1.size() != 0 && s2.size() != 0 && s1.top() == s2.top())
{
s1.pop();
s2.pop();
}
if(s1.size() == 0)
{
return s2.top()->next;
}
else if(s2.size() == 0)
{
return s1.top()->next;
}
else
{
return s1.top()->next;
}
}
};