[leetcode] 160:相交链表

leetcode-160 相交链表:传送门

我的思路

分别求出链表的长度numa和numb,如果链表相交,在相交节点及以后两个链表的长度是相等的,那么只要长的链表头节点先走 链表长度差 的距离,之后两个链表节点同时往后走,就一定能找到相交节点;如果链表不相交,链表的结点最后会指向空,返回空。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    ListNode* pa = headA;
    ListNode* pb = headB;
    int numa = 0;
    int numb = 0;
    //求链表长度
    while(pa != nullptr){
        numa++;
        pa = pa->next;
    }
    while(pb != nullptr){
        numb++;
        pb = pb->next;
    }
    pa = headA;
    pb = headB;
    //长链表先走 |numa-numb| 的长度
    if(numa > numb){
        int dif = numa - numb;
        while(dif > 0){
            pa = pa->next;
            dif--;
        }
    }
    else{
        int dif = numb - numa;
        while(dif > 0){
            pb = pb->next;
            dif--;
        }
    }
    //找相交节点
    while(pa != nullptr && pb != nullptr && pa != pb){
        pa = pa->next;
        pb = pb->next;
    }
    return pa;
}

优化

参考派派大佬:传送门
你以为我开始写优化的算法了,其实我准备写爱情
分别用指针pa和pb指向两个链表的头节点,指针同时移动,当指针为空时指向另一条链表的头节点继续遍历,直到两指针相遇,有相交节点则在节点处相遇,不相交则在最后都指向nullptr(认为在nullptr处相遇)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    ListNode* pa = headA;
    ListNode* pb = headB;
    while(pa != pb){
        if(pa != nullptr)
            pa = pa->next;
        else
            pa = headB;
        if(pb != nullptr)
            pb = pb->next;
        else
            pb = headA;
    }
    return pa;
}

(与这种 爱情[bushi] 类似的题还有判断链表是否有环问题)

–以上–

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值