双指针-链表相交

1.题目描述

题目链接
在这里插入图片描述
解题思路:题目求两个链表是否有交点,一般思路就是一个一个比较,虽然可以得出结果但是时间复杂度偏高,观察可以得知两个链表如果有相交结点那么后面的每个结点都一样,因此我们可以先计算两个链表的长度,然后用一个指针遍历较长的那条链表,遍历步数为两个链表的差值,再开始比较,如果当前节点不相同,则两链表指针同时向后遍历。两指针指向相同则代表找到了相交节点。

2.测试代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int len_a=0;//链表a的长度
        ListNode* p;
        p=headA;
        while(p!=nullptr){
            p=p->next;
            len_a++;
        }
        p=headA;
        int len_b=0;//链表b的长度
        ListNode* q;
        q=headB;
        while(q!=nullptr){
            q=q->next;
            len_b++;
        }
        q=headB;       
        int diff;
        // diff=len_a-len_b > 0 ? len_a-len_b : len_b-len_a;
        if(len_b>len_a){//使链表a始终为最长链表
            swap(len_a,len_b);
            swap(p,q);
        }
        diff=len_a-len_b;
        while(diff>0){//链表a先遍历差值步
            p=p->next;
            diff--;
        }
        while(p!=nullptr){
            if(p==q){
                return p;
            }else{
                p=p->next;
                q=q->next;
            }
        }
        return nullptr;
    }
};

3.测试结果

在这里插入图片描述
结果分析:通过观察题目,使用双指针使时间复杂度达到O(m+n),先用一个指针遍历较长的链表,然后两个指针同时遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值