剑指offer52两个链表的第一个公共节点
Posted Heisenber9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer52两个链表的第一个公共节点相关的知识,希望对你有一定的参考价值。
题目
输入两个链表,找出它们的第一个公共结点。
思路一
因为是反向找,所以会想到用栈。将两个链表都压入两个栈,然后反向弹出,找出第一个公共节点。思路很简单
class Solution { public: ListNode* 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* common = nullptr; while (s1.size() && s2.size()) { if (s1.top() == s2.top()) common = s1.top(); s1.pop(); s2.pop(); } return common; } };
思路二
链表这种问题往往可以用快慢指针,先统计出两个链表的长度l1,l2
然后让长一点的链表从头节点先走 |l1-l2|,然后两个指针一起走,第一个相同的就是公共节点
class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if ( pHead1 == nullptr || pHead2 == nullptr) return nullptr; int len1 = ListLength(pHead1); int len2 = ListLength(pHead2); ListNode* longer = pHead1; ListNode* shorter = pHead2; for (int i = 1; i <= abs(len1 - len2);i++) len1 > len2?longer = longer->next: shorter = shorter->next; while (longer != shorter && shorter && longer) { longer = longer->next; shorter = shorter->next; } return longer; // 当两个没有公共节点时,会返回尾结点,正好是nullptr } int ListLength(ListNode* pHead){ ListNode* pre = pHead; int count = 0; while (pre != nullptr) { count++; pre = pre->next; } return count; } };
以上是关于剑指offer52两个链表的第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章