题目描述
输入两个链表,找出它们的第一个公共结点。
解:思路一:栈
如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的。也就是说两个链表从尾部往前到某个点,节点都是一样的。我们可以用两个栈分别来装这两条链表。一个一个比较出来的值。找到第一个相同的节点。
ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2)
{
if(!pHead1 || !pHead2)
return NULL;
unordered_set<ListNode*> s;
ListNode* p1=pHead1,*p2=pHead2;
while(p1)
{
s.insert(p1);
p1=p1->next;
}
while(p2)
{
if(s.find(p2)!=s.end())
return p2;
p2=p2->next;
}
return NULL;
}
思路二:哈希表
设表1长度n,表2长度m,暴力法嵌套遍历两个链表需要O(mn)的时间复杂度, 可以采用hash的思想将其中一个转存为哈希表结构,这样建哈希表时间O(m), 而遍历链表时间O(n),而遍历时查找哈希表的时间为O(1),因此复杂度降为O(m+n), 但需要辅助空间。(这种哈希优化的策略是种一般性的思路,谨记!)
ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2)
{
if(!pHead1 || !pHead2)
return NULL;
stack<ListNode*> s1;
stack<ListNode*> s2;
ListNode *p1=pHead1,*p2=pHead2;
while(p1)
{
s1.push(p1);
p1=p1->next;
}
while(p2)
{
s2.push(p2);
p2=p2->next;
}
ListNode* commonNode=NULL;
while(!s1.empty() && !s2.empty())
{
ListNode* p3=s1.top();
ListNode* p4=s2.top();
if(p3==p4)
commonNode=p3;
else
break;
s1.pop();
s2.pop();
}
return commonNode;
}