求两个单向链表的交点

代码

struct Node
{
        int data;
	struct Node * next;
};

 Node* FixIntersetion(Node* pHead1, Node* pHead2)
{
    Node* p1 = pHead1;
    Node* p2 = pHead2;
    int i = 1, j = 1, k = 0, diff = 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;        //如果尾节点不同,直接返回NULL
    }
    else                   //否则寻找第一个相同的节点
    {
		p1=pHead1;
		p2=pHead2;
		//使得两者的起始比较位置离尾部的长度一致
		if(i>j)
		{
			diff=i-j; 
			for(k=0; k<diff; k++)
            {
                p1 = p1->next;
            }
		}
		if(i<j)
		{
			diff=j-i; 
			for(k=0; k<diff; k++)
            {
                p2 = p2->next;
            }
		}
		//开始比对,得出交点
		while(p1 != p2)
        {
            p1 = p1->next;
            p2 = p2->next;
        }
        return p1;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值