求两个单向无环链表的第一个公共交点

题目描述:给定两个无环链表,长度分别为n和m,求它们的第一个交点。

 

分析:如果两个链表有公共节点,也就是说两个链表从某一点开始,它们的next指针都指向同一个节点,但由于是单

向链表,那么每个节点都只有一个next指针,所以从第一个公共节点开始,之后它们所有的节点都是重合的,那么它

们的拓扑形状就像Y字型。

 

既然这样,那么我们可以这样做,如果它们的尾节点相同,说明这两个链表是相交的。如果要求交点,我们有一个很

好的算法,先求出这两个链表的长度,假设分别为xlen和ylen,并且xlen>ylen,先在链表x上走xlen-ylen的长

度,然后两个链表剩余的部分长度就一样了,这样再同时扫描,直到走到同一个节点结束,时间复杂度为O(m+n)。

 

 

核心代码:

struct node
{
    int val;
    node *next;
};

node *head,*p,*q;

void Init()
{
    head = new node();
    q = head;
}

void Insert(int x)
{
    p = new node();
    p->val = x;
    q->next = p;
    q = p;
    q->next = NULL;
}

int Length(int *t)
{
    int len = 0;
    while(t)
    {
        len++;
        t = t->next;
    }
    return len;
}

node *Find(node* &x,node* &y)
{
    int xlen = Length(x);
    int ylen = Length(y);
    node *Lx = x;
    node *Ly = y;
    if(xlen > ylen)
    {
        for(int i=1;i<=xlen-ylen;i++)
            Lx = Lx->next;
    }
    else
    {
        for(int i=1;i<=ylen-xlen;i++)
            Ly = Ly->next;
    }
    while(Lx && Ly)
    {
        if(Lx == Ly)
            return Lx;
        Lx = Lx->next;
        Ly = Ly->next;
    }
    return NULL;
}


 

 

其实本题还有一个方法也比较可靠:我们知道如果两个链表相交必成Y字型,那么我们把其中一个链表首尾相连,然

后来检测另外一个链表是否存在环,如果存在,则说明相交,并且我们可以求出环的入口点即为链表相交的第一个节

点。相反,如果不存在环,那么说明这两个链表不相交。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值