/* 题目: 求两个链表的第一个公共节点。 */ /* 思路: 见代码。 */ #include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> using namespace std; struct ListNode{ int val; struct ListNode* next; ListNode(int x): val(x),next(nullptr){ } }; ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2){ if(pHead1 == nullptr || pHead2 == nullptr){ return nullptr; } int len1 = 0,len2 = 0; ListNode* p1 = pHead1, *p2 = pHead2; //得到链表1的长度 while(p1 != nullptr){ len1++; p1 = p1->next; } //得到链表2的长度 while(p2 != nullptr){ len2++; p2 = p2->next; } ListNode* pLong = pHead1; ListNode* pShort = pHead2; int step = len1 - len2; if(len1 < len2){ pLong = pHead2; pShort = pHead1; step = len2 - len1; } //长链表先走几步,使得两个链表的长度相等 while(step--){ pLong = pLong->next; } //得到第一个重合的链表节点 while(pLong != pShort){ pLong = pLong->next; pShort = pShort->next; } return pLong; } int main(){ ListNode* p1 = new ListNode(1); ListNode* p2 = new ListNode(2); ListNode* p3 = new ListNode(3); p1->next = p2; p2->next = p3; ListNode* res = FindFirstCommonNode(p1,p2); cout<<res->val<<endl; }