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

腾讯精选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
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页