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

题目:两个较长的单向链表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)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值