本文链接:
https://blog.csdn.net/qq_34811382/article/details/113130647
160 相交链表
思路:
利用两个指针来进行遍历,P1先从l1开始然后l2,p2先从l2开始然后l1。
如果有重合的,后面的元素一定是重合的。
代码:
class Solution
{
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode *a = headA, *b = headB;
while (a != b)
{
if (headA == nullptr || headB == nullptr)
return nullptr;
if (a != nullptr)
a = a->next;
else
a = headB;
if (b != nullptr)
b = b->next;
else
b = headA;
}
return a;
}
};
169 多数元素
思路:
摩尔投票,如果有人投你,计数就++,否则就- -,如果超过半数投你,最后你的计数肯定大于0
通俗来讲,核心就是对拼消耗。
玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自己人。
代码:
class Solution
{
public:
int majorityElement(vector<int> &nums)
{
int count = 0, cadicate = 0;
for (int n : nums)
{
if (count == 0)
cadicate = n;
if (cadicate == n)
count++;
else
count--;
}
return cadicate;
}
};
206 反转链表
思路:
双指针,一点一点的反转。通过一次遍历,将第一个节点作为尾节点,第二个节点指向第一个,第三个指向第四个……
代码:
class Solution
{
public:
ListNode *reverseList(ListNode *head)
{
if (head == nullptr || head->next == nullptr)
return head;
ListNode *end = nullptr, *p1 = head;
while (p1 != nullptr)
{
ListNode *temp = p1->next;
p1->next = end;
end = p1;
p1 = temp;
}
return end;
}
};