剑指offer:求两个链表的第一个公共节点
Posted _阿锋丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:求两个链表的第一个公共节点相关的知识,希望对你有一定的参考价值。
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路及代码
stack解法:
两个链表先分别进栈 再依次出栈,从后向前遍历遇到第一个不相等的节点 返回上一个相同节点即可
/*
struct ListNode
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL)
;*/
class Solution
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2)
ListNode *ta = pHead1;
ListNode *tb = pHead2;
while(ta!=tb)
// 当ta指向空的时候说明 第一个链表的长度 已经走完了,同理tb也是这样,
// 所以最后走的长度是a+b(两个链表加起来的长度)
ta = ta ? ta->next:pHead1;
tb = tb ? tb->next:pHead2;
return ta;
;
双指针解法:
连接两个链表,使两个指针遍历的长度相等,遇到第一个相同的节点返回即可 还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法
/*
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;
stack<ListNode*> st1;
stack<ListNode*> st2;
while(pHead1)
st1.push(pHead1);
pHead1 = pHead1->next;
while(pHead2)
st2.push(pHead2);
pHead2 = pHead2->next;
ListNode *cur = nullptr;
while(!st1.empty() && !st2.empty()&& st1.top() == st2.top())
cur = st1.top();
st1.pop();
st2.pop();
return cur;
;
map解法:
利用map的唯一键性质,先把链表1放入map中 再依次把链表2放进去,返回第一个值为2的键即可
/*
struct ListNode
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL)
;*/
class Solution
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2)
map<ListNode*,int> maps_List;
if(!pHead1 || !pHead2)
return nullptr;
while(pHead1)
maps_List[pHead1]++;
pHead1 = pHead1->next;
while(pHead2)
maps_List[pHead2]++;
if(maps_List[pHead2]==2)
break;
pHead2 = pHead2->next;
return pHead2;
;
以上是关于剑指offer:求两个链表的第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章
[8月4日]剑指 Offer 52. 两个链表的第一个公共节点