栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《五月集训》第二十九日——分而治之

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《五月集训》第二十九日——分而治之

前言

这是五月集训的第二十九日,今日的训练内容是 分而治之

解题报告 1.力扣21 原题链接

21. 合并两个有序链表

题目概述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

解题思路

这题我使用的思路是使用递归,最开始的思路是重新创建一个新的函数使用递归将前两个传入的链表都填入第三个链表中,但是这样出现了空指针的bug,找了一阵子没有想明白问题出在哪里,直接换思路吧。

仍然是递归,这次直接使用函数本身进行递归好了。首先来考虑一下递归的出口,不论 list1 和 list2哪一方链表结束了,那接下来就直接把没结束的链表填到当前链表的后面也就可以了。

顺着这个思路,那假如两个链表都没结束,那就对当前的两个链表指针指向的结点的值域进行比较,拿 list1->val 比较大的情况进行说明。 list1->val 既然比较大的话,那就说明 list2的结点就要填在当前的位置了,所以我们就可以拿 list2 作为返回的链表,接下来的操作就直接对它进行就可以了,因为链表的表头就肯定是指针现在指向的结点,所以现在开始填充下一项吧,下一项要进行的也是一样的操作,于是我们就可以使用 list2->next=mergeTwoLists(list1,list2->next);进行递归,对最终返回链表的每一项都进行相同的操作,填充完之后直接返回头指针就可以了,因为每一次递归都是对没有操作过的结点进行操作。

值得一说的是,这个思路就是归并排序的链表实现方法。只不过这是进行到了最后一步的归并。

源码剖析
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if(list1==NULL) return list2;
    if(list2==NULL) return list1;
    if(list1->val>list2->val){
       list2->next=mergeTwoLists(list1,list2->next);
       return list2;
    }else{
        list1->next=mergeTwoLists(list1->next,list2);
        return list1;
    }
}
2.力扣1985 原题链接

1985. 找出数组中的第 K 大整数

题目概述

给你一个字符串数组 nums 和一个整数 k 。nums 中的每个字符串都表示一个不含前导零的整数。

返回 nums 中表示第 k 大整数的字符串。

注意:重复的数字在统计时会视为不同元素考虑。例如,如果 nums 是 [“1”,“2”,“2”],那么 “2” 是最大的整数,“2” 是第二大的整数,“1” 是第三大的整数。

解题思路

直接使用qsort()排序即可。

源码剖析
int cmp(const void*a,const void*b){
    char *aa = *(char**)a;
    char *bb = *(char**)b;
    int la = strlen(aa);
    int lb = strlen(bb);
    if (la == lb) {
        return strcmp(bb, aa);
    }
    return lb - la;
}
char * kthLargestNumber(char ** nums, int numsSize, int k){
    qsort(nums, numsSize, sizeof(nums[0]), cmp);
    return nums[k - 1];
}
3.力扣558 原题链接

558. 四叉树交集

4.力扣932 原题链接

932. 漂亮数组

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号