ACwing 题解 [66.两个链表的第一公共结点](Cpp)
题目链接
题目描述
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
数据范围
链表长度 [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)