链表OJ题

在这里插入图片描述
今天继续分享我们关于链表的OJ题。
第一题
在这里插入图片描述
合并升序链表

这道题我们可以这样理解,首先是不带哨兵位,我们先给一个head和tail指针,然后第一个链表和第二个链表进行比较,如果list1的数据比list2的数据大的时候,我们就尾插到head中,但是因为我们链表没有哨兵位,所以要考虑是否为空的情况,当我们head不为空的时候,先尾插,然后更新list和tail的位置,往后移动,直到一个链表为空的时候,结束,再把不是空的链表中的数据插入到链表当中去。

那我们来写这道题吧。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
        if(list1==NULL)
        {
            return list2;
        }
        if(list2==NULL)
        {
            return list1;
        }
        //如果链表一个为空,就直接返回不是空的链表。

        struct ListNode*head;
        struct ListNode*tail;
        tail=NULL;
        head=NULL;
        while(list1 && list2)
        {
            if(list1->val>list2->val)
            {
                if(head==NULL)
                {
                    head=tail=list2;
                    //head为空的时候,一个数据也没有

                }
                else
                {
                //插入数据,更新tail
                    tail->next=list2;
                    tail=tail->next;
                    
                }
                //放入数据list要更新
                list2=list2->next;
                
            }
            else
            {
               if(tail==NULL)
                {
                    head=tail=list1;
                    
                }
                else
                {
                    tail->next=list1;
                    tail=tail->next;
                    
                }
                list1=list1->next;
            }
        }
        //一个为空的话就退出。然后把不是空的放入就行了。
        if(list1==NULL)
        {
            tail->next=list2;
        }
        if(list2==NULL)
        {
            tail->next=list1;
        }
        return head;
}

上面的代码是没有哨兵位的,这题其实有一个哨兵位可能反而简单一点,让我们来看看有哨兵位的情况吧。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
        if(list1==NULL)
        {
            return list2;
        }
        if(list2==NULL)
        {
            return list1;
        }

        struct ListNode*head=( struct ListNode*)malloc(sizeof(struct ListNode));
        head->next=NULL;
       struct ListNode* tail=head;
        while(list1 && list2)
        {
            if(list1->val>list2->val)
            {
                tail->next=list2;
                tail=tail->next;
                list2=list2->next;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
                list1=list1->next;
            }
        }
        if(list1==NULL)
        {
            tail->next=list2;
        }
        if(list2==NULL)
        {
            tail->next=list1;
        }
        struct ListNode*next=head->next;
        free(head);
        return next;
}

代码明显简单一点了,其实也是差不多的,就是有哨兵位不用判断第一个节点是否是空,直接放入就行了。

题目二
添加链接描述
在这里插入图片描述

这道题目我们创建两个带哨兵位的链表来存放,比它大的放在一个链表中,小的在放到另一个链表当中,最后进行链接就行了。我们来看代码

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode*greathead=(struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode*greattail=greathead;
        struct ListNode*lesshead=(struct ListNode*)malloc(sizeof(struct ListNode));
         struct ListNode*lesstail=lesshead;
         struct ListNode*cur=pHead;
         while(cur)
         {
            if(cur->val>=x)
            {
                greattail->next=cur;
                greattail=greattail->next;
                cur=cur->next;
            }
            else
            {
                lesstail->next=cur;
                lesstail=lesstail->next;
                cur=cur->next;
            }
         }
         //防止变成循环链表
         greattail->next=NULL;
         lesstail->next=greathead->next;
         
          struct ListNode*next=lesshead->next;
          free(greathead);
          free(lesshead);
          return next;
    }
};

这道题难在我们如何将链表链接,其实如大家画画图,把大的放一起,小的放一起,这样最后在链接他们就可以解决问题了。

第三题
判断链表是不是回文结构

在这里插入图片描述
这道题的思路真的很难想到,我们要先取出中间的位置,然后反转中间位置后面的链表,在进行比较,我们先把它当成数组来理解,就先找到中间数,然后反转后面的数,比如图中的1->2->2->1,经过我们上面的步骤就是变成1->2->1->2.然后从中间开始比较过去和第一个比较,如果相等的话就是回文到结束的时候。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

struct ListNode* midnode(struct ListNode* head)
{
        struct ListNode*slow,*fast;
        slow=fast=head;
        while(fast && fast->next )
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
}
struct ListNode*midreserve(struct ListNode*mid)
{
    struct ListNode*cur=mid;
    struct ListNode*prev=NULL;
    struct ListNode*head=mid;
    struct ListNode*next=mid->next;
    while(cur)
    {
        cur->next=prev;
        prev=cur;
        cur=next;
        if(next)
        {
            next=next->next;
        }
    }
    return prev;
}
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode*mid=midnode(A);
        struct ListNode*remid=midreserve(mid);
        while(remid)
        {
            if(A->val!=remid->val)
            {
                return false;
            }
            A=A->next;
            remid=remid->next;

        }
        return true;
    }
};

这道题其实主要是思路难想到,又要先取这个链表的中点,然后再去倒置它,在按顺序进行比较,真的很难想到,想到了又很难去实现,首先我们先用快慢指针找到中点,然后将中间后面的数据进行逆置,可以用头插的方式,当然也可以用我们三个指针指向前后进行逆置。

做完这个我们再来一题分享题目就算是过去了,原因是后面的题目我也只是会一点,还要继续努力。

在这里插入图片描述
题目四
相交链表

在这里插入图片描述

在这里插入图片描述
这道题我们先用遍历一遍headA和headB算出他们的元素个数,然后找出长的,再找出长的时候我们就可以判断一个东西,那就是如果最后一个都不相同,那后面就不可能相同,所以结束的时候我们就可以先判断一下,然后让长链表先走k步,k是他们相差的数,然后我们就可以一起走,如果不相等就往后,一直到相等的时候,而且这是赢相等的,那我们来看一下代码吧!!

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
      struct ListNode *curA=headA;
      struct ListNode *curB=headB;
      int s1=1;
      int s2=1;
      while(curA->next)
      {
          curA=curA->next;
          s1++;
      }
      while(curB->next)
      {
          curB=curB->next;
          s2++;
      }
      if(curA!=curB)
      {
          return NULL;
      }
      int k=abs(s1-s2);
     struct ListNode *longNode=headA;
      struct ListNode *shortNode=headB;
      if(s1<s2)
      {
          longNode=headB;
          shortNode=headA;
      }
      while(k--)
      {
          longNode=longNode->next;
      }
      while(longNode!=shortNode)
      {
          longNode=longNode->next;
          shortNode=shortNode->next;
      }
      return shortNode;
}

今天的分享就到这里了,链表的题目后面还有,但是先不分享了等到后面再分享,下一期应该是双链表,这是一个很厉害的链表嗷!我们下次见

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

juc基础(二)

目录 一、集合的线程安全 1、List集合 2、hashset 3、hashmap 二、多线程锁 三、Callable&Future 接口 1、Callable接口 2、Future 接口 3、FutureTask 四、JUC 三大辅助类 1、减少计数 CountDownLatch 2、 循环栅栏 CyclicBarrier 3、信号灯 Semaphore 一、…

Android开发基础知识总结(四)简单控件(下)

一.按钮触控 最常见的按钮button类继承自Textview类。 需要注意的是&#xff0c;在Button中显示的单词默认全部大写 ~ public void onClick(View v){s1et1.getText().toString();//有一些小bug&#xff0c;好像变量必须声明在Onclick方法内部才有效&#xff1f;&#xff1f;&am…

SpringMVC拦截器学习笔记

SpringMVC拦截器 拦截器知识 拦截器(Interceptor)用于对URL请求进行前置/后置过滤 Interceptor与Filter用途相似但实现方式不同 Interceptor底层就是基于Spring AOP面向切面编程实现 拦截器开发流程 Maven添加依赖包servlet-api <dependency><groupId>javax.se…

Hadoop小结(上)

最近在学大模型的分布式训练和存储&#xff0c;自己的分布式相关基础比较薄弱&#xff0c;基于深度学习的一切架构皆来源于传统&#xff0c;我总结了之前大数据的分布式解决方案即Hadoop&#xff1a; Why Hadoop Hadoop 的作用非常简单&#xff0c;就是在多计算机集群环境中营…

【经验】VScode 远程连接 Ubuntu 出错,Could not establish connection

用VScode常常会碰到以下情况&#xff0c;Could not establish connection。 先介绍一下VScode远程连接和终端SSH连接的区别&#xff1a;终端直接用SSH连接时&#xff0c;只需要开启SSH服务&#xff0c;并消耗少量的内存即可&#xff1b;VScode连接时&#xff0c;会自动在服务器…

二、Kafka快速入门

目录 2.1 安装部署1、【单机部署】2、【集群部署】 2.2 Kafka命令行操作1、查看topic相关命令参数2、查看当前kafka服务器中的所有Topic3、创建 first topic4、查看 first 主题的详情5、修改分区数&#xff08;注意&#xff1a;分区数只能增加&#xff0c;不能减少&#xff09;…

Java后端开发面试题——微服务篇总结

Spring Cloud 5大组件有哪些&#xff1f; 随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件 注册中心/配置中心 Nacos 负载均衡 Ribbon 服务调用 Feign 服务保护 sentinel 服务网关 Gateway Ribbon负载均衡策略有哪些 ? RoundRobinRule&…

opencv-手势识别

# HandTrackingModule.py import cv2 import mediapipe as mpclass HandDetector:"""使用mediapipe库查找手。导出地标像素格式。添加了额外的功能。如查找方式&#xff0c;许多手指向上或两个手指之间的距离。而且提供找到的手的边界框信息。"""…

强训第38天

选择 D 0作为本地宿主机&#xff0c;127作为内部回送&#xff0c;不予分配 A B C C 存储在浏览器 D A B B D 网络延迟是指从报文开始进入网络到它离开网络之间的时间 编程 红与黑 红与黑__牛客网 #include <iostream> #include <stdexcept> #include <string…

在vue3+ts+vite中使用svg图片

目录 前言 步骤 1.安装svg-sprite-loader,这里使用的是6.0.11版本 2.项目的svg图片存放在src/icons下&#xff0c;我们在这里创建两个文件index.ts和index.vue&#xff08;在哪创建和文件名字并没有任何要求&#xff09; 3.在index.ts中加入下列代码(如果报错找不到fs模块请…

飞天使-k8s基础组件分析-控制器

文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说&#xff0c;一个ReplicationCo…

无涯教程-Perl - wantarray函数

描述 如果当前正在执行的函数的context正在寻找列表值,则此函数返回true。在标量context中返回false。 语法 以下是此函数的简单语法- wantarray返回值 如果没有context,则此函数返回undef&#xff1b;如果lvalue需要标量,则该函数返回0。 例 以下是显示其基本用法的示例…

3种获取OpenStreetMap数据的方法【OSM】

OpenStreetMap 是每个人都可以编辑的世界地图。 这意味着你可以纠正错误、添加新地点&#xff0c;甚至自己为地图做出贡献&#xff01; 这是一个社区驱动的项目&#xff0c;拥有数百万注册用户。 这是一个社区驱动的项目&#xff0c;旨在在开放许可下向每个人提供所有地理数据。…

Centos 7 安装系列(8):openGauss 3.0.0

安装依赖包&#xff1a; yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch redhat-lsb-core readline-devel openssl-devel sqlite-devel libnsl 安装插件&#xff1a; yum install -y bzip2 net-tools为什么要安装这两个&#xff1f; 安装bzip2 是…

SSRF 服务器端请求伪造

文章目录 SSRF(curl)网址访问通过file协议访问本地文件dict协议扫描内网主机开放端口 SSRF(file_get_content)网站访问http协议请求内网资源通过file协议访问本地文件 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用…

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…

TCP/IP---网络层

一、网络层的主要功能 1、提供了通讯过程中&#xff0c;必须要使用的另一个地址&#xff1a;逻辑IP地址【ipv4、ipv6】 2、连接不同媒介类型【内网--外网&#xff08;intra -- inter&#xff09;】 3、根据运行的不同的路由协议&#xff0c;选择不同的最佳路径 4、在选择的最好…

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法是典型最短路径算法&#xff0c;用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展&#xff08;广度优先搜索思想&#xff09;&#xff0c;直到扩展到终点为止。 算法过程 设置…

微信小程序 车牌号输入组件

概述 一个小组件&#xff0c;用于方便用户输入车牌号码 详细 概述 有时候我们开发过程中会遇到需要用户输入车牌号的情况&#xff0c;让客户通过自带键盘输入&#xff0c;体验不好且容易出错&#xff0c;例如车牌号是不能输入O和I的&#xff0c;因此需要有一个自定义的键盘…

2023/8/16 华为云OCR识别驾驶证、行驶证

目录 一、 注册华为云账号开通识别驾驶证、行驶证服务 二、编写配置文件 2.1、配置秘钥 2.2、 编写配置工具类 三、接口测试 3.1、测试接口 3.2、结果 四、实际工作中遇到的问题 4.1、前端传值问题 4.2、后端获取数据问题 4.3、使用openfeign调用接口报错 4.3、前端显示问题…