LeetCode第20天--相交链表

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

示例:

 

输出:8

输出:2

解题思路:首先将两个链表遍历一遍,并且统计它们的长度,求出两个链表的长度差,让长的链表先走长度差步,然后两个链表一起走并判断它们的地址是否相等即可。

代码实现: 


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
	struct ListNode *tailA = headA;
	struct ListNode *tailB  = headB;
	int lena = 1, lenb = 1;
	while (tailA->next)
	{
		lena++;
		tailA = tailA->next;
	}
	while (tailB->next)
	{
		lenb++;
		tailB = tailB->next;
	}
    if(tailA != tailB)
    {
        return NULL;
    }

    //相交节点  长的先走差距步,然后两个同时走
	struct ListNode *shortList = headA;
	struct ListNode *longList  = headB;
    if(lena > lenb)
    {
        longList = headA;
        shortList = headB;
    }
	int t = abs(lena - lenb);

    while(t--)
    {
        longList = longList->next;
    }
    while(shortList && longList)
    {
        if(shortList == longList)
        {
            return shortList;
        }
        shortList = shortList->next;
        longList = longList->next;
    }
    return NULL;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值