您的位置:首页 > Web前端

两个链表的第一个公共节点

2017-08-20 16:07 183 查看

题目

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

思路

分别扫描2个链表,并记录两个链表的长度,如果两个链表有公共节点,那么他们的尾节点一定是一样的。在确定会有公共节点后,根据两个链表的长度差,把长的链表先进行移动,一直到两个链表剩下来的长度相等,在这之后两个链表同时往后扫描,一直第一个公共节点。

参考代码

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
if (!(pHead1 && pHead2)) return nullptr;
int cnt1 = 0, cnt2 = 0;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while (p1->next) {
p1 = p1->next;
cnt1++;
}
while (p2->next) {
p2 = p2->next;
cnt2++;
}
if (p1 != p2) return nullptr;
else {
if (cnt1 > cnt2) {
int temp = cnt1 - cnt2;
while (temp--) {
pHead1 = pHead1->next;
}
} else {
int temp = cnt2 - cnt1;
while (temp--) {
pHead2 = pHead2->next;
}
}
while (pHead1 != pHead2) {
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return pHead1;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer