腾讯精选50题—Day11题目136,141,142
第十一天~
1. 题目136 只出现一次的数字
(1) 题目描述
(2) 思路
给定的序列中只有一次出现一次的数字,借助异或运算的性质,遍历一遍数据便可以得到答案。
(3) 题解
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ant = nums[0];
int len = nums.size();
for (int i = 1; i < len; i++)
{
ant = ant ^ nums[i];
}
return ant;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目141 环形链表
(1) 题目描述
(2) 思路
快慢指针法判断链表是否有环,如果链表有环,那么慢指针一定可以追上快指针。
(3) 题解
class Solution {
public:
bool hasCycle(ListNode* head) {
ListNode* quick = head;
ListNode* slow = head;
while (quick!=NULL &&quick->next != NULL)
{
quick = quick->next->next;
slow = slow->next;
if (quick == slow)
return true;
}
return false;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
n
n
n为链表的结点数
空间复杂度:
O
(
1
)
O(1)
O(1)
3. 题目142 环形链表II
(1) 题目描述
(2) 思路
在141题的基础上,我们需要记录slow指针和quick指针相等的位置为record,用一个新的遍历指针和record一起增加,直到找到入口。
(3) 题解
class Solution {
public:
ListNode* detectCycle(ListNode* head) {
ListNode* quick = head;
ListNode* slow = head;
ListNode* record = head;
while (quick != NULL && quick->next != NULL)
{
slow = slow->next;
quick = quick->next->next;
if (quick == slow)
{
record = slow;
ListNode* p = head;
while (p != record)
{
p = p->next;
record = record->next;
}
return p;
}
}
return NULL;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)