刷题分享:腾讯精选练习 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 投票算法】原理比较神奇,直觉上觉得能理解,所以我觉得记忆就好。

  1. 记录当前值和次数;
  2. 如果遍历值与当前值相同,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. 反转链表

简单链表运用,故不做题解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值