题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
思路
方法1:计算两两链表的长度差为k,让长的那个先走k步,再一起走,当两指针值相同时,就找到了相加的结点
方法2:用unordered_set存储A中的结点,然后遍历B,看B中的结点是否存在A中
方法3:利用两链表的长度和为定值
**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//方法1:
// int lenA=0;
// int lenB=0;
// ListNode *p = headA;
// ListNode *q = headB;
// while(p!=NULL){
// lenA++;
// p = p->next;
// }
// while(q!=NULL){
// lenB++;
// q = q->next;
// }
// p = headA;
// q = headB;
// if(lenA>lenB){
// int cha = lenA-lenB;
// while(cha--) p = p->next;
// while(p!=NULL){
// if(p==q) return p;
// p = p->next;
// q = q->next;
// }
// }
// else{
// int cha = lenB-lenA;
// while(cha--) q = q->next;
// while(p!=NULL){
// if(p==q) return p;
// p = p->next;
// q = q->next;
// }
// }
// return NULL;
//方法2
// unordered_set<ListNode*> s;
// ListNode *p=headA;
// while(p!=NULL){
// s.emplace(p);
// p = p->next;
// }
// ListNode *q=headB;
// while(q!=NULL){
// if(s.find(q)!=s.end()) return q;
// q = q->next;
// }
// return NULL;
//方法3
ListNode *p = headA;
ListNode *q = headB;
while(p!=q){
if(p!=NULL) p=p->next;
else p = headB;
if(q!=NULL) q=q->next;
else q=headA;
}
return p;
}
};
补充一下C++ unorder_set的用法:
emplace():向容器中添加新元素,效率比 insert() 方法高。
find(key):查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(如果 end() 方法返回的迭代器)