题目描述:
输入两个链表,找出它们的第一个公共结点。
思路:
题目要求单链表,第一个公共节点之后的节点均为两个链表的公共节点,先求两个链表的长度,较长的链表先由头结点往后遍历,直到剩余链表长度等于短链表长度,两个链表一起遍历,直到第一个相同节点,即为第一个公共节点。
时间复杂度O(n)
/*
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 == nullptr || pHead2 == nullptr) return nullptr;
ListNode *tmp = pHead1;
int size1 = 0;
while (tmp != nullptr) {
++size1;
tmp = tmp->next;
}
int size2 = 0;
tmp = pHead2;
while (tmp != nullptr) {
++size2;
tmp = tmp->next;
}
tmp = size1 > size2 ? pHead1 : pHead2;
ListNode *sho = size1 > size2 ? pHead2 : pHead1;
int len = abs(size1 - size2);
while (len) {
tmp = tmp->next;
--len;
}
while (tmp != nullptr && tmp->val != sho->val) {//此处有错误(可能存在节点值相同,但不是同一个节点),但在牛客网可以通过,应该改为tmp!=nullptr && tmp != sho
tmp = tmp->next;
sho = sho->next;
}
return tmp;
}
};