struct ListNode
{
int data;
struct ListNode* next;
};
//两个链表的第一个公共节点
/********************************************************
链表是单向链表,如果两个单向链表有公共结点,那么这两个
链表从某一结点开始,他们的next都指向同一个结点。
但由于单向链表的结点,每个结点只有一个next,因此从第一
个公共结点开始,之后他们所有结点都是重合的,不可能出现
分叉。所以两个有公共结点而部分重合的链表,拓扑结构像
一个Y,而不像X。
我们可以先遍历这两个链表,得到他们的长度,比如分别为m,n
假设m>n,则在长链表上先走m-n步,然后短链表再开始起步,和
长脸表开始同时遍历,找到第一个公共结点
//时间复杂度为O(m+n),空间复杂度为O(1)
*********************************************************/
ListNode* FindFirstCommonNode(ListNode* phead1, ListNode* phead2)
{
int length1 = GetListNode(phead1);
int length2 = GetListNode(phead2);
ListNode* p1 = phead1;
ListNode* p2 = phead2;
int n = length1 - length2;
if(length2 > length1)
{
p1 = phead2;
p2 = phead1;
n = length2 - length1;
}
for(int i=0; i<n; ++i)
p1 = p1->next;
while(p1 != NULL && p2 != NULL && p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
//得到第一个公共结点
ListNode* pFirstNode = p1;
return pFirstNode;
}
int GetListLength(ListNode* phead)
{
if(phead == NULL)
return 0;
int count = 0;
ListNode* p = phead1;
while(p->next != NULL)
{
count++;
p = p->next;
}
return count;
}
两个链表的第一个公共节点
最新推荐文章于 2023-07-14 23:37:28 发布