7月17日-周一

一、刷题
力扣349,两个数组的交集

主要注意点就是,在存放结果的时候要用哈希表来去重

整体代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> tmpRes;
        unordered_set<int> set;
        for (int a : nums1) {
            set.insert(a);
        }
        for (int b : nums2) {
            if (set.find(b) != set.end()) {
                tmpRes.insert(b);
            }
        }
        return vector<int>(tmpRes.begin(), tmpRes.end());
    }
};

力扣242,有效字母异位词

是由哈希法,注意创建一个26大小的数组来代替哈希表就行了

整体代码:

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) return false;
        }
        return true;
    }
};

力扣142,环形链表Ⅱ

主要分两个步骤:1)判断是否有环:使用快慢指针,如果快慢指针相遇说明有环

2)找到入环节点:这里需要公式推导:

2(x+y)= x + y + n (y + z) -->x + y = n (y + z) --> x = (n - 1)(y + z) + z

由上可得出从相遇节点和头结点出发,相遇的节点就是入环节点

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) {//相遇则有环
                ListNode* tmp1 = head;
                ListNode* tmp2 = fast;
                while (tmp1 != tmp2) {//相遇点时入环节点
                    tmp1 = tmp1->next;
                    tmp2 = tmp2->next;
                }
                return tmp1;
            }
        }
        return NULL;
    }
};

力扣160,相交链表

使用双指针法,主要思路是将两个链表的尾部对齐,然后从短的一个链表的头结点开始遍历,如果相遇则相交,不相遇则不相交

整体代码:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //1、统计两个链表的节点数量
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0;
        int lenB = 0;
        while (curA != NULL) {
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) {
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        if (lenA < lenB) {
            swap(lenA, lenB);
            swap(curA, curB);
        }
        //2、计算长度差值,定位起始节点
        int gap = lenA - lenB;
        while (gap--) {
            curA = curA->next;
        }
        //3、同时遍历两个链表,相遇则链表相交
        while (curA != NULL) {
            if (curA == curB) return curA;
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值