leetcode腾讯50-23-26-33

23. 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode() : val(0), next(nullptr) {}

 *     ListNode(int x) : val(x), next(nullptr) {}

 *     ListNode(int x, ListNode *next) : val(x), next(next) {}

 * };

 */

class Solution {

public:

    ListNode* mergeKLists(vector<ListNode*>& lists) {


        return merge(lists, 0, lists.size() - 1);

    }

     ListNode* mergeTwoLists(ListNode *a, ListNode *b) {

        if ((!a) || (!b)) return a ? a : b;

        ListNode head, *tail = &head, *aPtr = a, *bPtr = b;

        while (aPtr && bPtr) {

            if (aPtr->val < bPtr->val) {

                tail->next = aPtr; aPtr = aPtr->next;

            } else {

                tail->next = bPtr; bPtr = bPtr->next;

            }

            tail = tail->next;

        }

        tail->next = (aPtr ? aPtr : bPtr);

        return head.next;

    }

    ListNode* merge(vector <ListNode*> &lists, int l, int r) {

        if (l == r) return lists[l];

        if (l > r) return nullptr;

        int mid = (l + r) >> 1;

        return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));

    }

};

26. 删除排序数组中的重复项

给定一个排序数组,你需要在 原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地 修改输入数组并在使用 O(1) 额外空间的条件下完成。


class Solution {

public:

    int removeDuplicates(vector<int>& nums) {

        if(nums.empty())return 0;

        int pre=0;

        for(int cur=1;cur<nums.size();cur++)

        {

            if(nums[cur]!=nums[pre])

            {

                pre++;

                if(cur-pre>=1)

                {

                    nums[pre]=nums[cur];

                }

            }

        }

        return pre+1;


    }

};

class Solution {

public:

    int removeDuplicates(vector<int>& nums) {

        if(nums.empty())return 0;

        int pre=0;

        for(int cur=1;cur<nums.size();cur++)

        {

            if(nums[cur]!=nums[pre])

            {

                pre++;

                if(cur-pre>=1)

                {

                    nums[pre]=nums[cur];

                }

            }

        }

        return pre+1;


    }

};

33. 搜索旋转排序数组

升序排列的整数数组nums在预先未知的某个点上进行了旋转(例如,[0,1,2,4,5,6,7]经旋转后可能变为[4,5,6,7,0,1,2])。

请你在数组中搜索target,如果数组中存在这个目标值,则返回它的索引,否则返回-1。


class Solution {

public:

    int search(vector<int>& nums, int target) {

        //考虑折半查找找到最小元素位置,再找target是否存在

        int n=nums.size();

               if (!n) {

            return -1;

        }

        if (n == 1) {

            return nums[0] == target ? 0 : -1;

        }

        int l = 0, r = n - 1;

        while (l <= r) {

            int mid = (l + r) / 2;

            if (nums[mid] == target) return mid;

            if (nums[0] <= nums[mid]) {

                if (nums[0] <= target && target < nums[mid]) {

                    r = mid - 1;

                } else {

                    l = mid + 1;

                }

            } else {

                if (nums[mid] < target && target <= nums[n - 1]) {

                    l = mid + 1;

                } else {

                    r = mid - 1;

                }

            }

        }

        return -1;

    }

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容