阿里巴巴2014校园招聘算法题

时间:2022-09-02 18:49:55

题目:两个较长的单向链表a和b,为了找出节点node满足node in a 并且node in b。请设计空间使用尽量小的算法(用c/c++,java 或者伪代码)

思路:我们定义节点的距离为节点到链表开始所经过的节点数。如果两个链表长度相同,则相交节点其在两个链表上的距离一定相等。对于长度不同的两个链表,我们可以采用对齐的方式,使其向长度短的链表对齐。这样就可以应用上面的思路

具体算法如下:

struct node  
{
int v;
node *next;
};
/*
返回链表的长度
链表为空 返回0
*/
size_t listLen(node * p)
{
size_t num = 0;
while (p!=NULL)
{
num++;
p = p->next;
}
return num;
}
// 如果找到了 则返回指针 指向公共节点
// 如果不存在 则返回空指针
node * findFirstCommenNode(node * pheada, node * pheadb)
{
size_t lenA = listLen(pheada);
size_t lenB = listLen(pheadb);

node * plistA = pheada;
node * plistB = pheadb;
//调整长度,让plistA 指向较长的一个链表
if (lenA < lenB)
{
plistB = pheada;
plistA = pheadb;
size_t t = lenA;
lenA = lenB;
lenB = t;
}
while(lenA > lenB)
{
plistA = plistA->next;
--lenA;
}
//一样长了
//寻找公共节点
while (plistA!=NULL && plistA != plistB)
{
plistA = plistA->next;
plistB = plistB->next;
}
return plistA;
}

算法的空间复杂度O(1),时间复杂度O(m+n)