Description
输入两个链表,找出它们的第一个公共节点。若不存在则返回NULL
要求时间复杂度O(N), 空间复杂度O(1)
Solution
有点类似寻找LCA,故可借用朴素求LCA的思想,先把两个节点拉到同一深度,再同时向树根跳,第一次相遇的节点就是LCA。
因此,本质上我们只需要预先求出两个链表长度的差值,再按照求LCA的方法即可。
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
typedef ListNode* p;
int d = 0;
void dfs(p u, p v) {
if(u->next == NULL || v->next == NULL) {
if(u->next == NULL && v->next == NULL) d = 0;
else if(u->next == NULL) while(v->next != NULL) v = v->next, d--;
else if(v->next == NULL) while(u->next != NULL) u = u->next, d++;
return ;
}dfs(u->next, v->next);
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL) return NULL;
dfs(headA,headB);
p u = headA, v = headB;
if(d > 0) while(d--) u = u->next;
else if(d < 0) while(d++) v = v->next;
p res = NULL;
while(true) {
if(u == v) {res = u;break;}
if(u->next == NULL || v->next == NULL) break;
u = u->next, v = v->next;
}return res;
}
};