不是烧焦的焦
这里是交点的交!!
我们要求的问题是,判断两个链表是否是相交的,并且如果是相交的话,找出交点!!
两个链表的相对位置有以下六种,其中我们这里讨论的是不带环的链表相交!
显而易见
我们要判断两个不带环链表的相交很简单! 只需要看其尾结点是否一致,便可做出判断
对此,我们先首先构造一个相交的链表,再通过我们的代码进行判断!!
构造相交链表的代码:
PNode List1;
PNode List2;
SListInit(&List1);
SListInit(&List2);
PNodePushBack(&List1, 1);
PNodePushBack(&List1, 2);
PNodePushBack(&List1, 3);
PNodePushBack(&List1, 4);
PNodePushBack(&List1, 5);
PNodePushBack(&List2, 9);
PNodePushBack(&List2, 0);
PNodePushBack(&List2, 6);
PNodePushBack(&List2, 7);
PNodePushBack(&List2, 8);
PNode pCur = List2;
while (pCur->_pNext)
{
pCur = pCur->_pNext;
}
pCur->_pNext = FindDataNode(List1, 4);
printSList(List1);
printSList(List2);
判断是否相交的代码:
// 判断两个单链表是否相交---链表不带环
int IsSListCross(PNode pHead1, PNode pHead2)
{
if (pHead1 == NULL || pHead2 == NULL) //存在一个链表为空 即不相交 返回0
return 0;
while (pHead1->_pNext) //遍历链表 找到尾结点
pHead1 = pHead1->_pNext;
while (pHead2->_pNext)
pHead2 = pHead2->_pNext;
if (pHead1 == pHead2) //若 两个链表有相同的尾结点 则相交 返回1
return 1;
else
return 0; //否则不相交 返回0
}
测试结果:
那么我们如何求得他们的交点呢???
我很很容易知道 交点是 值为4和5 的两个结点
其实很简单
思路:
之前我们求过链表中间结点,倒数第K个结点等问题:https://blog.csdn.net/code_zx/article/details/80581825
这里的思路也是一样的,
首先:我们求出两条链表的长度
其次:我们将长的链表先走k步!(这里的k是两条链表的长度差值)
再次:我们将两个链表同时往后走
最后:当两个链表的结点一样时,我们便找到了第一个相交的结点
易知,该结点后的所有结点都是两个链表的交点
代码:
// 求两个单链表相交的交点---链表不带环
PNode GetCorssNode(PNode pHead1, PNode pHead2)
{
PNode pCorss = NULL;
int s1 = ListSize(pHead1);
int s2 = ListSize(pHead2);
if (s1 >= s2)
{
int i = s1 - s2;
while (i--)
pHead1 = pHead1->_pNext;
while (pHead1 != pHead2)
{
pHead1 = pHead1->_pNext;
pHead2 = pHead2->_pNext;
}
pCorss = pHead1;
}
else
pCorss = GetCorssNode(pHead2, pHead1);
return pCorss;
·}
测试结果:
最后:
链表相交的问题还有 带环链表的相交,关于这部分的解题方法,会陆续发出来!!!
谢谢!