总结一下,三种解法(C++实现):
////////////////////////////////////////////
①stack解法:
两个链表先分别进栈
再依次出栈,从后向前遍历遇到第一个不相等的节点
再依次出栈,从后向前遍历遇到第一个不相等的节点
返回上一个相同节点即可
////////////////////////////////////////////
class Solution {
public:
ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2) {
ListNode* res = NULL;
if(!pHead1 || !pHead2)
return res;
stack<ListNode*> stack1;
stack<ListNode*> stack2;
while(pHead1){
stack1.push(pHead1);
pHead1 = pHead1->next;
}
while(pHead2){
stack2.push(pHead2);
pHead2 = pHead2->next;
}
if(stack1.top() != stack2.top())
return res;
while(stack1.size() != 0 && stack2.size() != 0){
res = stack1.top();
stack1.pop();
stack2.pop();
if(!stack1.empty() && !stack2.empty() && stack1.top() != stack2.top())
return res;
}
return res;
}
}; //////////////////////////////////////////// ②双指针解法:
连接两个链表,使两个指针遍历的长度相等,遇到第一个相同的节点返回即可
还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法
////////////////////////////////////////////
还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法
////////////////////////////////////////////
class Solution { public:
ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2) {
if(!pHead1 || !pHead2)
return NULL;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while(p1 != p2){
p1 = p1==NULL?pHead2:p1->next;
p2 = p2==NULL?pHead1:p2->next;
}
return p1;
}
}; //////////////////////////////////////////// ③map解法:
利用map的唯一键性质,先把链表1放入map中
再依次把链表2放进去,返回第一个值为2的键即可
////////////////////////////////////////////
再依次把链表2放进去,返回第一个值为2的键即可
////////////////////////////////////////////
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
unordered_map<ListNode*,int> m;
//将pHead1的节点全部放入map中
while(pHead1){
m[pHead1]++;
pHead1 = pHead1->next;
}
while(pHead2){
m[pHead2]++;
if(m[pHead2] == 2)
return pHead2;//如果存在,则返回
pHead2 = pHead2->next;
}
return pHead2;
}
}; 
京公网安备 11010502036488号