一、刷题
力扣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;
}
};