单链表leetcode刷题/中(C语言版)

news2024/11/15 8:19:48

目录

题目1:合并两个有序链表 

题目2:分割链表

题目3:随机链表的复制


“单链表leetcode刷题/上”的链接:https://blog.csdn.net/2302_80297338/article/details/140409360?spm=1001.2014.3001.5501

题目1:合并两个有序链表

e87d7423e5f8409da60c165dcaf32a76.png

 解题思路:
        创建一个新链表,比较两个原链表的结点val值大小,小的尾插到新链表中,然后比较当前结点val小的链表中的下一个结点和当前结点val大的链表的同一结点。即遍历比较两个原链表每个结点的大小,小的尾插到新链表中,直到一个原链表已经全部遍历完结束。

        然后将还有一个原链表的剩余结点直接尾插到新链表后面,题目解决。

代码:

typedef struct ListNode listnode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    //小的就尾插在后面
    //一个为空,以及两个都是空的情况
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    //全都不为空的情况
    listnode* l1,*l2;
    l1=list1;
    l2=list2;
    listnode* newhead,*newtail;
    newhead=newtail=(listnode*)malloc(sizeof(listnode)); //创造一个头结点,作为新链表的头
    while(l1&&l2)
    {
        if(l1->val<l2->val)
        {
            newtail->next=l1;
            l1=l1->next;
        }
        else
        {
            newtail->next=l2;
            l2=l2->next;
        }
        newtail=newtail->next;
    }
    if(l2)//l2还有值
    {
        newtail->next=l2;
    }
    if(l1)
    {
        newtail->next=l1;
    }
    listnode* ret=newhead->next;
    free(newhead);
    newhead=NULL;
    return ret;
}

代码讲解:

        为了方便,笔者通过typedef将struct ListNode类型变为了listnode。

        情况1:list1、list2有一个是空链表。

        情况2:list1、list2两者都是空链表。

        情况3:list1、list2两者都不是空链表。

        针对情况1,可以使用两个if语句,如果某者为空,就直接返回不为空的链表。

        针对情况2,情况1的代码即可有效解决。

        针对情况3,整体思路上文已经解析完毕。在开辟完newhead这个结点后,理应将它free置空,防止内存泄露的出现。

ab9278e468834e49b96527064983de38.png

题目2:分割链表

dd8528d38db4480799efcf60444119bd.png

解题思路:

        开辟两个新链表,一个专门用来存比x小的值,一个专门用来存比x大于或等于的值。再创建一个指针pcur,遍历原链表。

        遍历完原链表以后,让大的新链表的尾元结点的next置为NULL,然后将小的链表和大的链表链接起来。

        最后对开辟的两个指针进行free操作,最后返回结果。

代码:

typedef struct ListNode listnode;
struct ListNode* partition(struct ListNode* head, int x){
    if(head==NULL)
    {
        return head;
    }
    listnode* smallhead,*smalltail;
    listnode* largehead,*largetail;
    listnode* pcur = head;
    smallhead=smalltail=(listnode*)malloc(sizeof(listnode));
    largehead=largetail=(listnode*)malloc(sizeof(listnode));
    while(pcur)
    {
        //两种尾插
        if(pcur->val<x)
        {
            smalltail->next=pcur;
            smalltail=smalltail->next;
        }
        else
        {
            largetail->next=pcur;
            largetail=largetail->next;
        }
        pcur=pcur->next;
    }
    largetail->next=NULL;
    smalltail->next=largehead->next;
    listnode* ret=smallhead->next;
    free(smallhead);
    free(largehead);
    return ret;
}

代码讲解:

        本题有使用到头节点的思想,两个新链表的开辟,开辟的都是头节点。后续的数据全都通过尾插进行,所以返回的时候要返回头结点的下一个结点。同时,因为存放数据小的链表和存放数据大的链表已经链接在一起了,所以只需要返回数据小的链表的首元结点,即可满足题目要求。

8b0015b1e60149cbb26eb5ad8cfd945a.png

题目3:随机链表的复制

1c119f73dcd54a5797b2ac9e43126f4b.png

8967247c9f75434eb88e36d4e2647808.png

解题思路:

        复制每一个结点(除最后一个空指针外),链接到每两个结点中间(或空指针和尾元结点之间)。具体如图一所示。

        让每一个复制好的结点的random指向原链表被复制结点的random所指向的结点的next。具体如图二所示。

        通过尾插的办法,让原链表和复制结点组成的链表分开,将复制结点组成的链表变成一个新链表,返回新链表的首元结点,题目解决。时间复杂度能够控制在O(n)以下。

d44fe61b44234c4e8a3149f1ca8a9b28.jpg

图一

85ca0911106d493cbf36d897024f1b4c.jpg

 图二

代码:

typedef struct Node node;


struct Node* copyRandomList(struct Node* head) {
    if(head ==NULL)
    {
        return head;
    }
    node* pcur=head;
    node* newnode;
    while(pcur)
    {
        node* newnode=(node*)malloc(sizeof(node));
        newnode->val=pcur->val;
        newnode->next=pcur->next;
        pcur->next=newnode;
        pcur=pcur->next->next;
    }

    pcur=head;
    node* copy=head->next;
    while(pcur)
    {
        if(pcur->random == NULL)
        {
            copy->random = NULL;
        }
        else
        {
            copy->random=pcur->random->next;
        }
            pcur=copy->next;
        if(pcur)
        {
            copy=pcur->next;
        }    
    }
    if(head->next->next)
{
    node* newhead,*newtail;
    pcur=newhead=head->next;
    newtail=pcur->next->next;
    while(newtail->next)
    {
        pcur->next=newtail;
        pcur=newtail;
        newtail=newtail->next->next;
    }
    pcur->next=newtail;
    return newhead;
}
    else{
        return (head->next);
    }
}

代码讲解:

        题设说明了,可能会出现空链表的情况。如果是空链表,那么就直接返回该链表。

        开创新的结点,复制原结点的val值进去,插在原链表的两个结点中间。每次完成该操作以后,pcur往后走两个结点(一个结点是newnode、一个结点是原链表中的pcur所在结点的下一个结点)。

        然后开始对random进行操作。当原链表某一被复制结点的random指向NULL,那么对应的复制节点的random也指向NULL。结束该操作以后,让pcur和copy同时往后走。

        最后进行尾插操作,要分为只有一个结点的原链表、有两个及两个以上结点的原链表这两种情况。

        对于只有一个结点的原链表,直接返回首元结点的下一个结点即可。

        对于有两个及两个以上结点的原链表,通过尾插代码,完成操作,返回复制节点所组成的新链表的首元结点即可。

2b88049184ee48e9be0e200c889362a0.png

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

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

相关文章

Ecovadis认证评估的四个方面 Ecovadis评估结果呈现形式

Ecovadis的认证过程严谨&#xff0c;基于国际公认的标准和准则进行评估。获得Ecovadis认证的企业&#xff0c;在社会责任、环境保护、商业道德和可持续采购等方面的表现得到了专业认可&#xff0c;这有助于提升企业的信誉度和透明度&#xff0c;增强利益相关者的信任。 Ecovad…

【CTF | WEB】003、攻防世界WEB题目之xff_referer

文章目录 xff_referer题目描述:解题思路&#xff1a;XFF与Referer基本了解1. XFF&#xff08;X-Forwarded-For&#xff09;&#xff1a;2. Referer&#xff1a;简单总结&#xff1a; 解题实操&#xff1a; xff_referer 题目描述: X老师告诉小宁其实xff和referer是可以伪造的。…

在 Linux 系统中下载 Python 并配置环境

哈喽&#xff0c;大家好&#xff0c;木易巷来啦&#xff01; 在 Linux 系统中下载 Python 并配置环境&#xff0c;主要包含以下几个核心步骤&#xff1a; ▍1、安装 Python 多数 Linux 发行版已预装 Python&#xff0c;但您可能需要安装不同版本或更新现有版本。 打开终端。 …

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置

前言 如果SSM学的比较好&#xff0c;那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展&#xff0c;完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架&#xff0c;可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…

失败:Windows--WSL2--Ubuntuon--Docker

编写目的&#xff1a; 在Windows上安装Docker&#xff0c;用Docker安装Gitlab、Jenkins等软件。 文章记录一下Windows上安装Docker的过程。 参考文档&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 下面用"参考文档"代替 目录 第一步&#xff1a;启…

学习计算机网络(三)——IP地址

一、IP协议&#xff08;IPV4、IPV6&#xff09; 表示形式&#xff08;两种&#xff09;&#xff1a; 点分十进制、二进制 地址被点分为4个部分&#xff0c;每个部分8位&#xff0c;总共32位。 A、B、C类地址都是单播地址&#xff08;一对一通信&#xff09;&#xff0c;D类…

谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

文章目录 一&#xff0c;175-商城业务-检索服务-检索查询参数模型分析抽取二&#xff0c;176-商城业务-检索服务-检索返回结果模型分析抽取三&#xff0c;177-商城业务-检索服务-检索DSL测试-查询部分四&#xff0c;178-商城业务-检索服务-检索DSL测试-聚合部分问题记录解决方案…

redis散列若干记录

字典 redis本身使用字典结构管理数据 redis使用hash表实现字典结构 使用了什么hash算法 使用SipHash算法&#xff0c;该算法能有效防止Hash表碰撞&#xff0c;并有不错的性能 hash冲突怎么解决 使用链表法解决hash冲突 hash表如何扩容 渐进式扩容&#xff0c;不会引起线程长期阻…

趣味算法------可截断素数

目录 题目描述&#xff1a; 思路解析&#xff1a; 质数判断函数&#xff1a; 反转函数&#xff1a; 右截断素数判断函数&#xff1a; 左可截断素数&#xff1a; 具体代码&#xff1a; 题目描述&#xff1a; 左截断素数是不包含 0 位的素数&#xff0c;当连续删除第一个数…

大四生都在的用8款AI论文生成器在线网站!

在当前的AI技术浪潮中&#xff0c;智能AI写作工具已经成为了学术研究和论文撰写的重要助手。对于大四生来说&#xff0c;选择合适的AI论文生成器可以大大提高写作效率和质量。以下是8款值得推荐的AI论文生成器在线网站&#xff1a; 一、千笔-AIPassPaPer 这是一款功能全面且高…

花几千上万学习Java,真没必要!(四十六)

Lambda表达式&#xff1a; 测试代码1&#xff1a; package test.lambda; public class LambdaDemo { // 实现Runnable接口的类 static class MyThread implements Runnable { Override public void run() { System.out.println("线程运行中&#xff1a;通过实现Runn…

【智能流体力学】ANSYS Fluent流体仿真基础、深度学习驱动思想及其CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

Datawhale AI 夏令营 第四期 AIGC Task2

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第四期&#xff09; 以及AIGC里面的本次任务说明&#xff1a;Task 2 精读代码&#xff0c;实战进阶 和上次任务一样&#xff0c;链接里的教程非常详细&#xff0c;对小白非常友好&#xff0c;从使用AI助手理解…

网工内推 | 网络、集成工程师,最高17K,NP以上认证优先

01 广东南方新媒体股份有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责基础设施运维管理&#xff0c;包括机房环境设备、网络设备、安全设备与服务器等&#xff0c;负责机房设备上架、下架、位置调整、布线等的常规操作。…

day36——homework

二、基于UDP的TFTP文件传输 1&#xff09;tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&am…

数据同步工具DataX

目录 1.概要 2.简介 3.DataX处理异构数据源 4.DataX的框架 5.DataX的核心架构 6.DataX的安装 7.DataX的使用案例 8.mysql同步到mysql案例 1.概要 本篇文件将介绍一款数据同步工具DataX的原理&#xff0c;安装&#xff0c;以及使用。 2.简介 官网连接&#xff1a;https…

STL经典案例(二)——公司招员工

需求&#xff1a;公司招了十个员工ABCDEFGHIJ&#xff0c;公司有五个部门&#xff0c;公司随机给这十个员工分配薪水&#xff0c;并且随机将这十名员工分配到不同的部门。 员工类中成员属性为姓名和工资&#xff0c;成员方法为设置姓名、设置工资、获得姓名、获得工资 部门有五…

Electron 开发桌面应用程序用于对接USB Audio Class协议

开发用于对接USB Audio Class协议的Electron桌面应用程序是一个复杂的任务&#xff0c;可能涉及多个开源库和项目的组合。以下是一些开源项目和库&#xff0c;它们可以帮助你实现这个目标&#xff1a; 1. Electron Electron 是一个用于构建跨平台桌面应用程序的框架。你可以使…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…

[C#]基于C# winform结合llamasharp部署llama3中文的gguf模型

【llmasharp源码】 https://github.com/SciSharp/LLamaSharp 【测试模型】 https://www.modelscope.cn/pooka74/LLaMA3-8B-Chat-Chinese-GGUF.git 【测试通过环境】 vs2019 netframework4.7.2 llamasharp0.15.0 cuda11.7.1cudnn8.8.0 注意测试发现使用cpu推理非常卡&a…