原题链接:
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/
1、set
用set先保存一个链表的所有节点,然后判断另外一个链表的节点是否在其中
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
set<ListNode*> st;
ListNode *p=headA;
while(p){
st.insert(p);
p=p->next;
}
p=headB;
while(p){
if(st.count(p)) return p;
p=p->next;
}
return NULL;
}
2、双指针
- 指针 pA指向 A 链表,指针 pB 指向 B 链表,依次往后遍历
- 如果 pA到了末尾,则 pA = headB 继续遍历
- 如果 pB到了末尾,则 pB = headA 继续遍历
- 直到两指针相遇,否则不会相遇
如图(来源):
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p=headA,*q=headB;
while(p!=q){
p=p!=NULL?p->next:headB;//到了末尾则指向B
q=q!=NULL?q->next:headA;//到了末尾则指向A
}
return p;
}