【题目】
输入两个链表,找出它们的第一个公共节点。
来源:leetcode
链接:https://leetcode-cn.com/problems/liang-ge-lian-biao-de-di-yi-ge-gong-gong-jie-dian-lcof/
【代码】
/**
* 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) {
if(!headA||!headB)
return NULL;
ListNode* ha=headA,*hb=headB;
while(ha&&hb){
ha=ha->next;
hb=hb->next;
}
while(ha){
ha=ha->next;
headA=headA->next;
}
while(hb){
hb=hb->next;
headB=headB->next;
}
while(headA&&!(headA==headB&&headA->next==headB->next)){
headA=headA->next;
headB=headB->next;
}
return headA;
}
};
【set】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
set<ListNode*> s;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
while(headA){
s.insert(headA);
headA=headA->next;
}
while(headB){
if(s.count(headB))
return headB;
headB=headB->next;
}
return NULL;
}
};
【双指针】
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* nodeA=headA,*nodeB=headB;
while(nodeA!=nodeB){
if(!nodeA)
nodeA=headB;
else
nodeA=nodeA->next;
if(!nodeB)
nodeB=headA;
else
nodeB=nodeB->next;
}
return nodeA;
}
};