两个链表的相交

 链接: https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/

//1.暴力遍历对比法

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

    struct ListNode* tailA=headA;

    struct ListNode* tailB=headB;

    while(tailA)

    {

        tailB=headB;

        while(tailB)

        {

            if(tailB==tailA)

            {

                return tailB;

            }

            tailB=tailB->next;

        }

        tailA=tailA->next;

    }

    return NULL;

}




//2.快慢(先后)指针法 (长链的指针先走长链与短链的差距步)

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

    if(headA==NULL&&headB==NULL)

    return NULL;

    struct ListNode* tailA=headA;

    struct ListNode* tailB=headB;

   int lenA=1;

   int lenB=1;

   while(tailA->next!=NULL)

   {

       lenA++;

       tailA=tailA->next;

   }

   while(tailB->next!=NULL)

   {

       lenB++;

       tailB=tailB->next;

   }

   //根据最后一个的节点的地址来判断两链是否有相交

   int k=abs(lenA-lenB);

   if(tailA==tailB)//有交点,相交

   {

      struct ListNode* shortlist=headA;

      struct ListNode* longlist=headB;

       if(lenA>lenB)

       {

           shortlist=headB;

           longlist=headA;

       }

       while(k--)//长链的指针先走长短差距步

       {

           longlist=longlist->next;

       }

       while(longlist!=shortlist)//然后再一起走

       {

           longlist=longlist->next;

           shortlist=shortlist->next;

       }

       return shortlist;

   }

   return NULL;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值