160相交链表 c++

160相交链表

写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点

1. 双指针

  1. 思路就是很简单下面注释

class Solution {
     
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     
        ListNode *a=headA;
        ListNode *b=headB;       
        int i=0,j=0,gap=0,value=0;
        while(headA!=nullptr){
     
            headA=headA->next;
            i++;
        }
        while(headB!=nullptr){
     
            headB=headB->next;
            j++;
        }
        //首先遍历链表长度
        if(i>j) {
     
            gap=i-j;
            while(gap){
     
                gap--;
                a=a->next;
            }
        }
        else{
     
            gap=j-i;
            while(gap){
     
                gap--;//不在循环里面写自减自加符号
                b=b->next;
            }
        } 
        //求的俩链表长度差,并指向同一长度的节点
        while(a!=nullptr){
     
            if(a==b)  {
     
                return a;
            }
            b=b->next;
            a=a->next;
        }
        return nullptr;
    }
};//遍历到指向同一节点时,返回该指针

2. 双指针解法2

  • 思路就是利用两个链表相加长度和一致,所以当一个两者中短链表遍历完之后,将其指向长链表,如果有共同节点,最终一定会相遇

class Solution {
     
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     
        if(headA==NULL||headB==NULL) return nullptr;   
        ListNode *a=headA,*b=headB;//一般都要定义两个指针,以免破坏结构
        while(a!=b){
     
            a=a->next;
            b=b->next;
            if(a==NULL&&b==NULL) return nullptr;
            if(a==NULL){
     
                a=headB;//指向
            }
            if(b==NULL){
     
                b=headA;
            }

        }
            return a;
    }
};

简洁答案

class Solution {
     
public:
    
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     

        if(headA == nullptr || headB == nullptr) 
            return nullptr;

        ListNode* cur_a = headA;
        ListNode* cur_b = headB;

        while(cur_a != cur_b)
        {
     
            cur_a = (cur_a ? cur_a->next : headB);//这句是精华,赋值语句中如果需要判断则可以使用这个
            cur_b = (cur_b ? cur_b->next : headA);
        }

        return cur_a;
    }
};

3. 哈希表

参考一下别人的代码


class Solution {
     
public:

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     
        std::unordered_set<ListNode*> set;
        ListNode* cur_a = headA;
        while (cur_a)
        {
     
            set.insert(cur_a);
            cur_a = cur_a->next;
        }

        ListNode* cur_b = headB;
        while (cur_b)
        {
     
            if(set.find(cur_b) != set.end()) //找到了
            {
     
                return cur_b;
            }
            cur_b = cur_b->next;
        }

        return nullptr;
    }
};

自己的代码


class Solution {
     
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     
        unordered_set<ListNode*>res;//这个地方只需要存储指针不需要存放值
        while(headA!=nullptr){
     //这个地方可以直接写成指针//headA
            res.insert(headA);
            headA=headA->next;//set与map不同set只能通过insert插入元素
        }
        while(headB!=nullptr){
     
           auto it=find(res.begin(),res.end(),headB);//奇怪我将这个地方改为res.find就可以通过了不超过时间限制了
           if(it==res.end()) headB=headB->next;
           else return *it;//注意这里应该是迭代器的解引用
        }
        return nullptr;


    }
};

知识点

  1. C++11nullptr关键字
  2. find函数

时间复杂度/空间复杂度分析/面试场景如何作答

方法一


  • 时间复杂度:O(n)
  • 空间复杂度: 空间复杂度为O(1)

你可能感兴趣的:(剑指offer,指针,链表,c++,数据结构)