相交链表的判断(leetcode)

思路一:先判断两个链表的最后一个结点是否相同,若相同,则会有结点。

                两条链表难免会出现长度不一样的情况,先让长的链表先走差距步。

 

 

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{   
    struct ListNode*curA = headA;
    struct ListNode*curB = headB;
    int lenA = 0,lenB=0;
    //计算headA链表中有多少个结点
    while(curA->next)
    {
        curA=curA->next;
        ++lenA;
    }
    while(curB->next)
    {
        curB=curB->next; 
        ++lenB;
    }
    //如果最后一个结点相同,就说明相交
    // if(curA!=curB)
    // {
    //     return NULL;
    // }
    
    //长的先走差距步,再同时走,第一个相等就是交点
    //假设法 先假设k1长k2短
    int gap = abs(lenA-lenB);
    printf("lenA: %d, lenB: %d, gap: %d\n", lenA, lenB, gap);
    struct ListNode*longList=headA,*shortList=headB;
    //假设错了,重新校验以下
    if(lenB>lenA)
    {
        longList = headB;
        shortList = headA;
    }

    while(gap--)
    {
        longList=longList->next;
    }
    while(shortList!=longList)
    {   
        longList=longList->next;
        shortList=shortList->next;
    }
    return shortList;
}

思路二 :先不顾两条链表的长短,先走到尾结点的链表跳到另外一个链表的头节点,这样也实现了先走差距步的效果。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *curA = headA;
    struct ListNode *curB = headB;
    while (curA != curB) {
        curA = curA ? curA->next : headB;
        curB = curB ? curB->next : headA;
    }
    return curA;
}

来自力扣题解中一位大神的思路!贞徳是非常纽博伊。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值