对于两个单链表,如果有公共结点,那么两个单链表的拓扑结构为Y型。可以想到尾结点是相同的。
1.从尾结点开始逆推,知道两个结点不相同(用栈)
2.因为从尾结点到第一个公共结点的长度是相同的,所以尾结点对齐,较长的链表先走若干步,然后与较短的链表齐头并进。
#include <iostream>
using namespace std;
struct ListNode
{
int value;
ListNode *next;
};
// 求链表长度
int getLength(ListNode *list)
{
int cnt = 0;
while (list != NULL)
{
++cnt;
list = list->next;
}
return cnt;
}
ListNode* findFirstCommonNode(ListNode* listA, ListNode* listB)
{
int lenA = getLength(listA);
int lenB = getLength(listB);
int offset = lenA - lenB;
ListNode* longList = listA;
ListNode* shortList = listB;
if (lenB > lenA)
{
offset = lenB - lenA;
longList = listB;
shortList = listA;
}
// 长链表先走几步
for (int i = 0; i < offset; ++i)
longList = longList->next;
// 齐头并进
while (longList != NULL)
{
if (longList == shortList)
return longList;
else
{
longList = longList->next;
shortList = shortList->next;
}
}
// 若没有公共结点,返回NULL(指针)
return NULL;
}
int main()
{
return 0;
}
关于测试:
1.头结点就相同,中间结点相同,尾结点相同,无公共结点,空链表。
对于两个单链表,如果有公共结点,那么两个单链表的拓扑结构为Y型。可以想到尾结点是相同的。
1.从尾结点开始逆推,知道两个结点不相同(用栈)
2.因为从尾结点到第一个公共结点的长度是相同的,所以尾结点对齐,较长的链表先走若干步,然后与较短的链表齐头并进。