两个链表的第一个公共节点
2017-04-01 00:26
141 查看
来源于我的博客
题目描述
输入两个链表,找出它们的第一个公共结点。/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/
例如:
1-2-4
6-7
3-5
两者第一个公共节点是6,两链表长度可能不一,但尾节点到第一个公共节点的长度是一致的。
常规解:栈
时间复杂度o(n),用两个栈各自保存两个链表,最后栈顶一定是相等的(如果有公共节点的话)class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode* t1=pHead1; ListNode* t2=pHead2; vector<ListNode*> stk1; vector<ListNode*> stk2; if(pHead2==nullptr||pHead1==nullptr) return nullptr; if(pHead2==pHead1) /*注意特殊情况的处理*/ return pHead2; while(t1!=nullptr){ stk1.push_back(t1); t1=t1->next; } while(t2!=nullptr){ stk2.push_back(t2); t2=t2->next; } if(stk1.back()!=stk2.back()) return nullptr; ListNode* pCommon=nullptr; while(stk1.back()==stk2.back()){ pCommon=stk1.back(); stk1.pop_back(); stk2.pop_back(); } return pCommon; } };
代码最短:
两个指针一直步进,直到两者第一次相等,即得到第一个公共节点例如:
12467|12467 |12467 |124 67
35673|56735|67356|735 67
class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode* t1=pHead1; ListNode* t2=pHead2; while(t1!=t2){ t1=(t1==nullptr ? pHead1:t1->next); t2=(t2==nullptr ? pHead2:t2->next); } return t1; } };
相关文章推荐
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- 找两个链表的第一个公共节点
- Intersection of Two Linked Lists(两个链表的第一个公共节点)
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- 输入两个链表,找出它们的第一个公共节点(值)
- 剑指offer------两个链表的第一个公共节点
- 剑指offer系列之35:两个链表的第一个公共节点
- 两个链表的第一个公共节点
- 面试题52:两个链表的第一个公共节点
- 面试题37:两个链表的第一个公共节点
- 面试题37:两个链表的第一个公共节点
- 找出两个链表的第一个公共节点
- 【剑指offer】面试题52:两个链表的第一个公共节点
- 剑指offer——两个链表的第一个公共结点(给出的方法,都是针对有且只有一个公共节点的方法)
- 剑指offer-两个链表的第一个公共节点
- 《剑指offer》两个链表的第一个公共节点
- 剑指offer之两个链表的第一个公共节点
- 寻找两个相交链表的第一个公共节点
- 两个链表的第一个公共节点
- 两个链表的第一个公共节点(Java实现)