题目描述
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
数据范围
链表长度 [1,2000]。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
思路
这里的难点在于两个链表的长度可能不一致,会导致指针的不同步,假如两个链表的长度相同时判断是否有公共结点就简单了很多,我们只需要依次遍历过去,然后每次做个比较即可。
综上所述,这里我采用的是链表对齐的办法。先判断哪个链表更长,以更长的那个链表作为主链,分别去比较它们第一个元素,如果第一元素相等,则该结点为第一个公共结点,如果不相等,则将该结点删除,指针移向下一个结点,当两个链表的长度相等的时候,再依次遍历去寻找公共结点
==================
a1 a2 c1 c2 c3
b1 b2 b3 c1 c2 c3
==================
a1 a2 c1 c2 c3
b2 b3 c1 c2 c3
==================
output :c1
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
int b[2] = {0,0};
ListNode* ha = headA;
ListNode* hb = headB;
while(ha != NULL){
b[0]++;
ha = ha->next;
}
while(hb != NULL){
b[1]++;
hb = hb->next;
}
if(b[0]>b[1]){
while(b[0]>b[1]){
ha = headA;
hb = headB;
if(ha == hb) return ha;
headA = headA->next;
b[0]--;
}
}else{
while(b[1]>b[0]){
ha = headA;
hb = headB;
if(ha == hb) return ha;
headB = headB->next;
b[1]--;
}
}
ha = headA;
hb = headB;
while(hb != NULL){
if(ha == hb) return ha;
ha = ha->next;
hb = hb->next;
}
return NULL;
}
};
时间复杂度: O(n)
空间复杂度: O(1)