面试题52. 两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
我的做法是先分别算出两个链表的长度,记长度的差值是dis,然后让长的链表先走dis步,然后再两个一起走。
/**
* 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==NULL||headB==NULL) return NULL;
int la = 0, lb = 0;
ListNode *tmpa=headA, *tmpb=headB;
while(tmpa) {
la++;
tmpa = tmpa->next;
}
while(tmpb) {
lb++;
tmpb = tmpb->next;
}
tmpa = headA, tmpb = headB;
int gap = abs(la-lb);
cout<<gap<<endl;
if(la<lb) {
while(gap--) {
tmpb = tmpb->next;
}
} else {
while(gap--) {
tmpa = tmpa->next;
}
}
cout<<tmpb->val<<endl;
while(tmpa){
cout<<tmpa->val<<' '<<tmpb->val<<endl;
if(tmpa==tmpb)
break;
tmpa = tmpa->next, tmpb = tmpb->next;
}
return tmpa;
}
};
leetcode上的题解给出一种更好的办法:
我们可以用两个指针分别指向 A 和 B,当到达末尾时指向另一个链表的开头,相遇的时候一定是交点,如果不相遇那么说明这两个链表不相交。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* h1 = headA, *h2 = headB;
while (h1 != h2) {
if(h1) h1 = h1->next;
else h1 = headB;
if(h2) h2 = h2->next;
else h2 = headA;
}
return h1;
}
};