LeetCode 21.剑指 Offer II 078. 合并两个有序链表 | C语言版

news2024/11/25 0:40:19

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

    • LeetCode 21. 合并两个有序链表
      • 题目描述
      • 解题思路
        • 思路一:使用栈
          • 代码实现
          • 运行结果
          • 参考文章:
        • 思路二:减少遍历节点数
          • 代码实现
          • 运行结果
          • 参考文章:[]()
    • LeetCode 剑指 Offer II 078. 合并排序链表
      • 题目描述
      • 解题思路
        • 思路一:分治思想,归并排序
          • 代码实现
          • 运行结果
          • 参考文章:[https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp%2Cc](https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp,c)
        • 思路二:减少遍历节点数
          • 代码实现
          • 运行结果
          • 参考文章:[]()

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中元素全部放入新链表x
    if (a) x->next = a;
    //如果链表b中还有元素(链表a中元素为空),将b中元素全部放入新链表x
    if (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

思路二:减少遍历节点数

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《MySQL系列-InnoDB引擎25》表-InnoDB逻辑存储结构

InnoDB逻辑存储结构 从InnoDB存储引擎的逻辑存储结构看&#xff0c;所有数据都被逻辑地存放在一个空间中&#xff0c;称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block)&#xff0c;InnoDB存储引擎的逻辑存储结构…

JVM系统优化实践(4):以支付系统为例

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;前面说过&#xff0c;JVM会将堆内存划分为年轻代、老年代两个区域。年轻代会将创建和使用完之后马上就要回收的对象放在里面&#xff0c;而老年代则将创建之后需要…

python刷题

目录标题1、输出前三同学的名字-input().split()2、字典的使用3、DA12 牛客网不同语言使用人数4、DA16 用户常用语言有多少5、python变量1、输出前三同学的名字-input().split() s1 input().split() print(tuple(s1)[:3])2、字典的使用 注意点&#xff1a;1&#xff0c;对字典…

如何使用 FreeSql 无缝接替 EF Core ?

如何使用 FreeSql 无缝接替 EF Core&#xff0c;并实现数据表的 CRUD 操作项目说明DB & 数据表结构DB & 数据表创建数据表 User 实体模型创建使用 EF Core 实现 User 表新增用户信息添加 EF Core 相关的 nuget 包编写 EF Core 操作 User 表的 CRUD 代码FreeSql 使用 Db…

系统启动太慢,调优后我直呼Nice

问题背景最近在负责一个订单系统的业务研发&#xff0c;本来不是件困难的事。但是服务的启动时间很慢&#xff0c;慢的令人发指。单次启动的时间约在10多分钟左右&#xff0c;基本一次迭代、开发&#xff0c;大部分的时间都花在了启动项目上。忍无可忍的我&#xff0c;终于决定…

链路追踪——【Brave】第一遍小结

前言 微服务链路追踪系列博客&#xff0c;后续可能会涉及到Brave、Zipkin、Sleuth内容的梳理。 Brave 何为Brave&#xff1f; github地址&#xff1a;https://github.com/openzipkin/brave Brave是一个分布式追踪埋点库。 #mermaid-svg-riwF9nbu1AldDJ7P {font-family:"…

大数据Hadoop教程-学习笔记05【Apache Hive DML语句与函数使用】

视频教程&#xff1a;哔哩哔哩网站&#xff1a;黑马大数据Hadoop入门视频教程 总时长&#xff1a;14:22:04教程资源: https://pan.baidu.com/s/1WYgyI3KgbzKzFD639lA-_g 提取码: 6666【P001-P017】大数据Hadoop教程-学习笔记01【大数据导论与Linux基础】【17p】【P018-P037】大…

一文带你搞定线程池原理

1.使用线程池的意义何在&#xff1f;项目开发中&#xff0c;为了统一管理线程&#xff0c;并有效精准地进行排错&#xff0c;我们经常要求项目人员统一使用线程池去创建线程。因为我们是在受不了有些人动不动就去创建一个线程&#xff0c;使用的多了以后&#xff0c;一旦报错就…

Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系

0. 相关分享 Android从屏幕刷新到View的绘制&#xff08;一&#xff09;之 Window、WindowManager和WindowManagerService之间的关系 Android从屏幕刷新到View的绘制&#xff08;二&#xff09;之Choreographer、Vsync与屏幕刷新 1. 相关类 WindowManagerService&#xff0c…

Linux安装Redis步骤

1 下载安装包并解压 官网&#xff1a;https://download.redis.io 下载安装包&#xff1a; wget https://download.redis.io/redis-stable.tar.gz 解压 tar -zxvf redis-stable.tar.gz* 2 安装 安装 cd redis-stable make install PREFIX/opt/install/redis6 设置环境变量 vi …

Python学习-----项目设计1.0(设计思维和ATM环境搭建)

目录 前言&#xff1a; 项目开发流程 MVC设计模式 什么是MVC设计模式&#xff1f; ATM项目要求 ATM项目的环境搭建 前言&#xff1a; 我个人学习Python大概也有一个月了&#xff0c;在这一个月中我发布了许多关于Python的文章&#xff0c;建立了一个Python学习起步的专栏…

企业级信息系统开发学习1.3——利用注解配置取代Spring配置文件

文章目录一、利用注解配置类取代Spring配置文件&#xff08;一&#xff09;打开项目&#xff08;二&#xff09;创建新包&#xff08;三&#xff09;拷贝类与接口&#xff08;四&#xff09;创建注解配置类&#xff08;五&#xff09;创建测试类&#xff08;六&#xff09;运行…

史上最经典垃圾回收器(CMS,G1)详解、适用场景及特点、使用命令

文章目录垃圾收集器介绍总结各个垃圾收集器之间的关系垃圾收集器使用命令及默认值详解各个垃圾收集器SerialParNewParallel ScavengeSerial OldParallel OldCMS(Concurrent Mark Sweep)G1(Garbage First)适用场景及推荐垃圾收集器介绍总结 垃圾收集器可以帮助我们进行具体的垃…

HDFS优化

单节点多块磁盘数据均衡 生成HDFS块均衡计划 hdfs diskbalancer -plan node1 执行均衡计划,node1.plan.json均衡计划文件 hdfs diskbalancer -execute node1.plan.json 查看当前均衡任务的执行情况 hdfs diskbalancer -query node1 取消均衡任务hdfs diskbalancer -cancel nod…

(三十九)undo log版本链是个什么东西?

今天我们正式开始切入讲解MySQL中多个事务并发执行时的隔离到底是怎么做的&#xff0c;因为我们知道默认是骚气的RR隔离级别&#xff0c;也就是说脏写、脏读、不可重复读、幻读&#xff0c;都不会发生&#xff0c;每个事务执行的时候&#xff0c;跟别的事务压根儿就没关系&…

移动web基础

初始缩小&#xff1a;布局视口大于视觉视口 初始放大&#xff1a;布局视口小于视觉视口 布局视口等于视觉视口&#xff08;这种动作行为叫做理想视口&#xff09; <meta name"viewport" content"width375" /> <meta name"viewport"…

云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版

前言&#xff1a; 前面写了一些关于calico的文章&#xff0c;但感觉好像是浅尝辄止&#xff0c;分散在了几篇文章内&#xff0c;并且很多地方还是没有说的太清楚云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换_calico换flannel_晚风_END的博客-CSDN博客 …

在C#中使用信号量解决多线程访问共享资源的冲突问题

目前在我写的233篇原创文章中&#xff0c;有两篇是粉丝可见的&#xff0c;其中《C#线程的参数传递、获取线程返回值以及处理多线程冲突》这篇文章有179个粉丝关注&#xff0c;看到不断有人关注这篇文章&#xff0c;这表明学习C#的人还是挺多的&#xff0c;感觉文章内容不够厚实…

泛型<E>

泛型 案例引出泛型 按要求写出代码&#xff1a; 在ArrayList中添加3个Dog对象&#xff0c;Dog对象有name和age两个属性&#xff0c;且输出name和age public class test1 {public static void main(String[] args) {ArrayList list new ArrayList();list.add(new Dog(10,&quo…

Python解题 - CSDN周赛第32期 - 运输石油(三维背包)

上期周赛因为最后一题出现bug&#xff0c;再加上都是经典的模板题&#xff0c;问哥就懒得写题解了。 本期也是有两道考过的题目&#xff0c;不过最后一题因为考到了背包问题的特殊类型&#xff0c;还是值得拿出来记个笔记。 第一题&#xff1a;传奇霸业 传奇霸业&#xff0c;是…