35 两个链表的第一个公共结点
题目描述
输入两个链表,找出它们的第一个公共结点。
思路:这里首先理解一下暴力的方法,对于链表1的每一个节点,都去链表2中查找是否有该节点。
然后自己在思考的时候陷入了是否有环链表,这道题目不需要考虑是否有环,因为有环其实就是一个链表。
这题使用快慢指针,先得到两个链表的长度,定义两个头结点,哪个长就是p1,短的就是p2,长的先走len1 -
len2,然后两个指针一起走,相交的时候就是第一个交点。
/* 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 == nullptr || pHead2 == nullptr){ return nullptr; } ListNode* p1 = pHead1,*p2 = pHead2; int len1 = 0,len2 = 0; while(p1 != nullptr){ ++len1; p1 = p1 -> next; } while(p2 != nullptr){ ++len2; p2 = p2 -> next; } p1 = pHead1; p2 = pHead2; if(len1 < len2){ p1 = pHead2; p2 = pHead1; } for(int i = 0;i < abs(len1 - len2);++i){ p1 = p1 -> next; } while(p1 != nullptr && p2 != nullptr){ if(p1 -> val == p2 -> val){ return p1; } else{ p1 = p1 -> next; p2 = p2 -> next; } } return nullptr; } };