您的位置:首页 > 其它

百度笔试算法第二题:如何判断两个单向链表是否有相交,并找出交点

2012-05-23 20:15 609 查看
1.复杂的就是一个一个的判断,复杂度O(m*n);

2.稍微便捷点的就是判断最后一个节点是否相等,复杂度O(m+n);

3.知道了两个链表的长度len1,len2,那么先让长的链表向后遍历abs(len1-len2),再进行同时遍历并一对一比较,这样的话复杂度为O(max(m,n))。

O(m+n)的代码如下:

View Code

/*===========================================================================
* Function name:   FindNode
* Parameter:       pHead1,pHead2分别为待判断的链表头结点
* Precondition:    两个链表已经建立
* Postcondition:   NONE
* Description:     判断两个单向链表是否有交点并返回交点
* Return value:    交点
===========================================================================*/
NODE* FindNode(NODE* pHead1, NODE* pHead2)
{
NODE* p1 = pHead1;
NODE* p2 = pHead2;
int i = 1, j = 1, k = 0, f = 0;

if(pHead2 == NULL || pHead2 == NULL)
{
return NULL;
}

while(p1->next != NULL)
{
p1 = p1->next;
i++;
}

while(p2->next != NULL)
{
p2 = p2->next;
j++;
}

if(p1 != p2)
{
return NULL;
}
else
{

f = fabs(i, j);
if(i > j)
{
p1 = pHead1;
p2 = pHead2;
}
else
{
p1 = pHead2;
p2 = pHead1;
}
for(k=0; k<f; k++)
{
p1 = p1->next;
}
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: