题目描述
输入两个链表,找出它们的第一个公共结点。
思路
1.公共节点以后是相同的,先得到两个链表的长度,然后长度相减得到len,长的链表先走len次,剩余部分/两个链表就一样长了,然后在继续一起走,如果结点相同就返回这个结点,不同就一直往后走,记得开始判断两个链表是否为空
2.还可以用两个栈s1,s2,分别入栈,然后出栈,栈顶相同就出栈,并记录此结点ntemp,一直到栈顶不相同的时候,前一个记录的结点ntemp就是第一个公共节点
code
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int length1,length2;
if (pHead1 == nullptr || pHead2 == nullptr)
return nullptr;
ListNode *p1=pHead1;
ListNode *p2=pHead2;
while(p1!=nullptr){
length1++;
p1=p1->next;
}
while(p2!=nullptr){
length2++;
p2=p2->next;
}
int length;
if(length1>length2){
length=length1-length2;
while(length--){
pHead1=pHead1->next;
}
}else{
length=length2-length1;
while(length--){
pHead2=pHead2->next;
}
}
while(pHead1!=nullptr){
if(pHead1==pHead2)
return pHead1;
pHead1=pHead1->next;
pHead2=pHead2->next;
}
return nullptr;
}
//2
LListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
stack<ListNode*>s1,s2;
if(pHead1==nullptr||pHead2==nullptr)
return nullptr;
while(pHead1!=nullptr){
s1.push(pHead1);
pHead1=pHead1->next;
}
while(pHead2!=nullptr){
s2.push(pHead2);
pHead2=pHead2->next;
}
ListNode* temp=nullptr;
while ((!s1.empty())&&(!s2.empty())&&s1.top()==s2.top()) {
temp=s1.top();
s1.pop();
s2.pop();
}
return temp;
}
};