例题-两个链表的第一个公共节点

题目描述

输入两个链表,找出它们的第一个公共结点

原理

因为拥有一个共同节点,所以先遍历两个链表得到他们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点(diff,如果一样长则diff为0)。在第二次遍历的时候,在较长的链表上先走若干(diff)步,接着同时在两个链表上遍历,找到的第一个相同的结点就是他们的第一个公共结点

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
struct ListNode
{
int val;
struct ListNode* next;
ListNode(int x, ListNode* ptr = nullptr) :
val(x), next(ptr) {}
};

ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{//合并链表
int count1 = 0;
int count2 = 0;
ListNode* nHead1 = pHead1;
ListNode* nHead2 = pHead2;
ListNode* res = nullptr;
while (pHead1 != nullptr)
{
count1++;
pHead1 = pHead1->next;
}
while (pHead2 != nullptr)
{
count2++;
pHead2 = pHead2->next;
}
int diff = count1 - count2;
if (diff > 0)
{
for (int i = 0; i < diff; i++)
nHead1 = nHead1->next;
} else
{
diff *= -1;
for (auto i = 0; i < diff; i++)
nHead2 = nHead2->next;
}
while (nHead1 != nullptr && nHead2 != nullptr)
{
if (nHead1 != nHead2)
{
nHead1 = nHead1->next;
nHead2 = nHead2->next;
}
else
{
res = nHead1;
return res;
}
}
return res;
}

输入为

1
[1,2,3,4,5,9,10],[12,11,9,10]

输出为

1
[9]