LeetCode 21. 合并两个有序链表 | C语言版

  • LeetCode 21. 合并两个有序链表
    • 题目描述
    • 解题思路
      • 思路一:使用栈
        • 代码实现
        • 运行结果
        • 参考文章:
      • 思路二:减少遍历节点数
        • 代码实现
        • 运行结果
        • 参考文章:[]()
  • LeetCode 剑指 Offer II 078. 合并排序链表
    • 题目描述
    • 解题思路
      • 思路一:分治思想,归并排序
        • 代码实现
        • 运行结果
        • 参考文章:
      • 思路二:减少遍历节点数
        • 代码实现
        • 运行结果
        • 参考文章:[]()
  • LeetCode 23. 合并K个升序链表
    • 题目描述
    • 解题思路
      • 思路一:分治思想
        • 代码实现
        • 运行结果
        • 参考文章:
      • 思路二:减少遍历节点数
        • 代码实现
        • 运行结果
        • 参考文章:[]()

LeetCode 21. 合并两个有序链表

题目描述

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

解题思路

思路一:使用栈

代码实现
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*//*
C初始动态分配语句 L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
每个数据元素所占用存储空间的大小 sizeof(ElemType)
*/struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){//list1为空if(!list1) return list2;//list2为空if(!list2) return list1;struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode)),*t=head;while(list1 && list2){if(list1->val<list2->val){t->next=list1;list1=list1->next;}else{t->next=list2;list2=list2->next;}t=t->next;}//list2为空(遍历完毕)if(list1) t->next=list1;//list1为空(遍历完毕)if(list2) t->next=list2;return head->next;}
运行结果

参考文章:

https://leetcode.cn/problems/merge-two-sorted-lists/solutions/126597/cliang-chong-fang-fa-chang-gui-di-gui-by-danny-50/?orderBy=most_votes&languageTags=c

思路二:减少遍历节点数

代码实现
在这里插入代码片
运行结果
参考文章:

LeetCode 剑指 Offer II 078. 合并排序链表

题目描述

题目地址:剑指 Offer II 078. 合并排序链表
给定一个链表数组,每个链表都已经按升序排列。
请将所有链表合并到一个升序链表中,返回合并后的链表。

解题思路

思路一:分治思想,归并排序

代码实现
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*//**利用归并排序的原理,采用分治思想:将k个已排序链表分成前k/2个已排序链表和后k/2个已排序链表,这两部分链表再继续递归地进行划分;递归到每组只剩一个链表时,再两两合并*///治:将链表合并
struct ListNode* merge(struct ListNode* a, struct ListNode* b){//虚拟头结点struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));//注意申请节点之后对结构体内的指针赋值,赋值为NULL总没问题dummy->next=NULL;//合并的新链表struct ListNode* x = dummy;//a=[1],[4],[5],[1]  b=[3],[4],[2],[6]while (a && b){//将小的数字放入到合并的新链表中(实现排序)if (a->val < b->val){x->next = a;a = a->next;}else{x->next = b;b = b->next;}x = x->next;}//如果链表a中还有元素(链表b中元素为空),将a中元素全部放入新链表xif (a) x->next = a;//如果链表b中还有元素(链表a中元素为空),将b中元素全部放入新链表xif (b) x->next = b;//x=[1,1,2,3,4,4,5,6]return dummy->next;
}//分
struct ListNode* merge_sort(struct ListNode** lists, int l, int r){if (l == r) return lists[l];int mid = (l + r) / 2;//递归分割链表,直至每个链表只有一个元素struct ListNode* L = merge_sort(lists, l, mid);struct ListNode* R = merge_sort(lists, mid + 1, r);//l=[1],[4],[5],[1]  r=[3],[4],[2],[6]//将这些链表(只有一个元素)按照升序合并return merge(L, R);
}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){//lists =[[1,4,5],[1,3,4],[2,6]]if (listsSize == 0) return NULL;return merge_sort(lists, 0, listsSize - 1);
}
运行结果

参考文章:

https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp%2Cc

思路二:减少遍历节点数

代码实现
在这里插入代码片
运行结果
参考文章:

LeetCode 23. 合并K个升序链表

题目描述

题目地址:23. 合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。

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

解题思路

思路一:分治思想

代码实现
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///治:合并两个有序链表
struct ListNode* merge(struct ListNode* l1, struct ListNode* l2){if(!l1) return l2;if(!l2) return l1;if(l1->val <= l2->val){l1->next = merge(l1->next, l2);return l1;}else{l2->next = merge(l1, l2->next);return l2;}}//分
struct ListNode* merge_sort(struct ListNode** lists, int l, int r){if (l == r) return lists[l];int mid = (l + r) / 2;//递归分割链表,直至每个链表只有一个元素struct ListNode* L = merge_sort(lists, l, mid);struct ListNode* R = merge_sort(lists, mid + 1, r);//将链表按照升序合并return merge(L, R);
}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){if (listsSize == 0) return NULL;return merge_sort(lists, 0, listsSize - 1);
}
运行结果

参考文章:

https://leetcode.cn/problems/merge-k-sorted-lists/solutions/172800/c-you-xian-dui-lie-liang-liang-he-bing-fen-zhi-he-/?orderBy=most_votes&languageTags=cpp%2Cc

思路二:减少遍历节点数

代码实现
在这里插入代码片
运行结果
参考文章:

LeetCode 21.23.剑指 Offer II 078. 合并两个有序链表 | C语言版相关推荐

  1. 小黑天寒地冻来到平谷蹭饭,抽几分钟的leetcode之旅:剑指 Offer II 045. 二叉树最底层最左边的值

    小黑代码 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, r ...

  2. 剑指offer系列14---合并两个升序链表

    14[题目]输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. * [思路]依次比较两个链表头指针,小者作为合并后的头指针,依次比较,使用递归. 1 pack ...

  3. 21. 合并两个有序链表(C语言)

    将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4 ...

  4. Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】

    这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...

  5. 剑指Offer II --- 2021/9/2

    目录 剑指Offer II 116. 朋友圈 剑指Offer II 098. 路径的数目 剑指Offer II 068. 查找插入位置 剑指Offer II 078. 合并排序链表 剑指Offer I ...

  6. 力扣OJ 剑指 Offer II

    目录 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 004. ...

  7. LeetCode Algorithm 剑指 Offer II 056. 二叉搜索树中两个节点之和

    剑指 Offer II 056. 二叉搜索树中两个节点之和 Ideas 这题有点类似一个组合题,首先是通过二叉树遍历得到一个序列,然后再通过LeetCode Algorithm 1. 两数之和的方法查 ...

  8. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  9. Leetcode刷题笔记——剑指offer II (六)【图】

    文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...

最新文章

  1. openstack安装在虚拟机上重启之后无法启动问题
  2. 科大讯飞CV赛baseline:图像分类实践+0.55
  3. Engineering:王军和张发明组发表人体肠道菌群的原位重建及昼夜节律的研究
  4. X86汇编——简易通讯录
  5. 编译原理—小型(简化)高级语言分析器前端(Java)
  6. 企业实战(Jenkins+GitLab+SonarQube)_12_Jenkins+soanr服务器搭建和代码检查
  7. a标签跳转后返回原页面 layui_layui页面操作,点击一个添加页面,跳转有确定,然后点击确定后将选择的几个数据返回前一个页面获取值,然后ajax请求后台...
  8. 三段式状态机_FPGA笔试题——序列检测(FSM状态机)
  9. 【递归算法01】递归的调用机制
  10. f77编程和c语言的区别,在fortran中l用F77编译器编译程序时出现问题?
  11. matlab实验论文,毕业论文--基于MATLAB的光学实验仿真
  12. ajax方法参数详解
  13. 温度冲击试验箱军标GJB 150与GB 2423区别
  14. Sentinel-2快速查询图幅号——基于MGRS_100kmSQ_ID_File_Geodatabase快速查询
  15. Object-C,文件路径API
  16. 鸿蒙杀戮手机电脑版,鸿蒙杀戮单职业
  17. 小米洪锋:跟7000万MIUI用户谈谈
  18. 人人都是 LSP?—— 种子与文件下载的相爱相杀
  19. IDA*算法实现的数字拼图游戏
  20. Linux中设置和重启网络的命令

热门文章

  1. PostgreSQL编写记录删除表格信息的Extension扩展
  2. r语言 图形一览_R语言实战—图形篇(图形初阶)
  3. day1开始在百度前端技术学院零基础学院学习前端开发
  4. CLAM——论文笔记
  5. 【愚公系列】2023年06月 网络安全(交通银行杯)-星际争霸
  6. 程序员表白代码大全,快来向你的ta表白吧___
  7. c语言笔记照片_C语言基础知识笔记
  8. 【数据分享】12.5米分辨率DEM地形数据(分省)
  9. 帮你自动填账号密码的黑科技,安卓用户的专属福利
  10. 关于PC客户端软件开发的一些思考