腾讯精选50题—Day11题目136,141,142

本文深入探讨了三个经典的链表问题:136题通过异或运算找出数组中只出现一次的数字;141题利用快慢指针检测环形链表;142题则是在检测环的基础上找到环的入口节点。每个问题都提供了详细的思路和高效解决方案,时间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

腾讯精选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)

参考

  1. 环形链表II
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值