腾讯精选50题—Day13题目160,169,206
第十三天~
1. 题目160 相交链表
(1) 题目描述
(2) 思路
公共部分长度为p,去除公共部分后链表A长度为m,链表B长度为n,那么让指针分别遍历一遍链表A和B,在遍历过程中重叠的位置就是交叉部分。
(3) 题解
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* pA = headA;
ListNode* pB = headB;
if (pA == NULL || pB == NULL)
return NULL;
while (pA != pB)
{
pA = pA == NULL ? headB : pA->next;
pB = pB == NULL ? headA : pB->next;
}
return pA;
}
};
结果:
时间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n)
空间复杂度:
O
(
1
)
O(1)
O(1)
2. 题目169 多数元素
(1) 题目描述
(2) 思路
排序。(待优化!)
(3) 题解
class Solution {
public:
int majorityElement(vector<int>& nums) {
sort(nums.begin(), nums.end());
return nums[nums.size() / 2];
}
};
结果:
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
空间复杂度:
O
(
l
o
g
n
)
O(logn)
O(logn)
3. 题目206 反转链表
(1) 题目描述
(2) 思路
头插法翻转链表。
(3) 题解
递归解法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next)
return head;
ListNode* temp = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return temp;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
遍历解法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL)
return NULL;
ListNode* p = head->next;
head->next = NULL;
while (p != NULL)
{
ListNode* tempNode = p;
p = p->next;
tempNode->next = head;
head = tempNode;
}
return head;
}
};
结果:
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)