腾讯精选练习 50 题 Day13
题目:160. 相交链表
来源:力扣(LeetCode) https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
【简单】编写一个程序,找到两个单链表相交的起始节点。
解题思路
假设链表A长度为a, 链表B的长度为b,此时a != b。但是,a+b == b+a
两个指针分别遍历,遇到尾结点则指向另一链表的头结点,此时长度相等。
执行代码
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}
复杂度
时间复杂度:O( n )
空间复杂度:O( 1 )
题目:169. 多数元素
来源:力扣(LeetCode)https://leetcode-cn.com/problems/majority-element/
【中等】给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
输入:[2,2,1,1,1,2,2]
输出:2
解题思路
【Boyer-Moore 投票算法】原理比较神奇,直觉上觉得能理解,所以我觉得记忆就好。
- 记录当前值和次数;
- 如果遍历值与当前值相同,times自增,不同,times自减;
nums: [7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
candidate: 7 7 7 7 7 7 5 5 5 5 5 5 7 7 7 7
count: 1 2 1 2 1 0 1 0 1 2 1 0 1 2 3 4
执行代码
class Solution {
public int majorityElement(int[] nums) {
int count = 0;
Integer candidate = null;
for (int num : nums) {
if (count == 0) candidate = num;
count += (num == candidate) ? 1 : -1;
}
return candidate;
}
}
复杂度
时间复杂度:O( n )
空间复杂度:O( 1 )
题目:206. 反转链表
简单链表运用,故不做题解。