您的位置:首页 > 职场人生

常见链表面试题之判断链表是否相交,并求交点

2016-05-20 15:36 211 查看
给定我们两个链表,在这里,我们先讨论单链表不带环的情况,我们该怎么判断它们是否相交?并求出其交点呢。

首先我们来分析一下两个链表相交都有哪几种情况。第一种就是Y型,它们从某一个节点相交,第二种是V型,它们直到尾节点才相交。下面两幅图分别对应两种情况。

1.Y型相交



2. V型相交



其实不难发现,如果两个链表相交的话,它们的尾节点肯定是相同的。所以如果要判断两个链表是否相交,我们可以遍历两个链表,看它们的尾节点是否相等,相等就能判定其相交。isCross函数,如果相交返回1,否则返回0.

int isCross(PNode pHead1, PNode pHead2)
{
PNode pnode1 = pHead1;
PNode pnode2 = pHead2;
if (pHead1 != NULL && pHead2 != NULL)
{
while (pnode1->pnext != NULL)
{
pnode1 = pnode1->pnext;
}
while (pnode2->pnext != NULL)
{
pnode2 = pnode2->pnext;
}
if (pnode1 == pnode2)  //判断尾节点是否相等
{
return 1;
}
}
return 0;
}


要求其交点的话(第一个交点),我们的思路应该很明显,就是找到其中第一个相等的节点,便是他们的第一个交点。

但此时就要考虑怎么进行节点的比较了,因为有Y型和V型,我们不能直接从第一个节点进行遍历比较,所以应该再写一个length函数用来求链表的长度,然后让长的链表先走,当走到一样长的地方开始进行比较,找到相等的节点就返回这个节点。

length函数:

int length(PNode pHead)
{
PNode pnode = pHead;
int len = 0;
if (pHead == NULL)
{
return 0;
}
while (pnode)
{
len++;
pnode = pnode->pnext;
}
return len;
}


GetCrossNode求交点函数:

PNode GetCrossNode(PNode pHead1, PNode pHead2)
{
PNode pnode1 = pHead1;
PNode pnode2 = pHead2;
int len1 = length(pHead1);
int len2 = length(pHead2);
int step = len1 - len2;
if (0 == isCross(pHead1, pHead2) || pHead1 == NULL || pHead2 == NULL)
{
return NULL;
}

if (step >= 0)
{
while (step--)
{
pnode1 = pnode1->pnext;
}
while (pnode1)
{
if (pnode1 == pnode2)
{
return pnode1;
}
pnode1 = pnode1->pnext;
pnode2 = pnode2->pnext;
}
}
else
{
step = 0 - step;
while (step--)
{
pnode2 = pnode2->pnext;
}
while (pnode2)
{
if (pnode1 == pnode2)
{
return pnode1;
}
pnode1 = pnode1->pnext;
pnode2 = pnode2->pnext;
}
}
return NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: