双指针-链表相交

1.题目描述

题目链接
双指针-链表相交_第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.测试结果

双指针-链表相交_第2张图片
结果分析:通过观察题目,使用双指针使时间复杂度达到O(m+n),先用一个指针遍历较长的链表,然后两个指针同时遍历。

你可能感兴趣的:(算法题,链表,数据结构,c++,c语言)