题目
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
解法:模拟
先确定两个链表的长度,然后让长的链表先走一段,直到两个链表剩余长度相等
这时两个链表同时开始走,直到遇到公共结点
时间复杂度O(n),空间复杂度O(n)
/**
* 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 lena = 0, lenb = 0;
auto pa = headA, pb = headB;
while (pa) {
pa = pa->next;
lena++;
}
while (pb) {
pb = pb->next;
lenb++;
}
pa = headA, pb = headB;
int d = lena - lenb;
if (d > 0) {
while (d--)
pa = pa->next;
}
else {
d = -d;
while (d--)
pb = pb->next;
}
while (pa && pb && pa != pb) {
pa = pa->next;
pb = pb->next;
}
return pa;
}
};