【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!

news2024/9/28 23:28:39

目录

1.数组题目合集

1.1 leetcode.27 移除元素

1.2 leetcode.26 删除有序数组中的重复项

1.3 leetcode.88 合并两个有数数组

2.链表题目合集

2.1 leetcode.203 移除链表元素

2.2 leetcode.206 反转链表

2.3 leetcode.876 链表的中间结点

2.4 牛客 链表中倒数第k个结点

2.5 leetcode.21 合并两个有序链表

2.6 leetcode.相交链表

2.7 leetcode.141 环形链表

2.8 leetcode.142 环形链表Ⅱ

2.9 复制带随机指针的链表


1.数组题目合集


1.1 leetcode.27 移除元素

OJ链接:移除元素(点此可跳转)

解题思路:题目要求不能开辟新的数组,所以只能在原数组上进行操作。我的做法是,遇到值等于val的元素时,将其与数组末尾的元素互换位置,再令数组的长度-1就达到了删除元素的效果。

解题实战:

int removeElement(int* nums, int numsSize, int val){
    int i=0;
    int j=0;
    while(i<numsSize)
    {
        while(val==nums[i]&&i<numsSize)
        {
           nums[i]=nums[numsSize-1];
           numsSize--;
        }
        i++;
    }
    return numsSize;

}

1.2 leetcode.26 删除有序数组中的重复项

OJ链接:删除有序数组中的重复项

解题思路:本题采用双指针的方式,p1来记录当前位置,p2来寻找与p1处的值不相同的元素。找到后让p2处的值与p1+1处的值进行交换。一直循环本操作,直至p2走完整个数组。

解题实战:

int removeDuplicates(int* nums, int numsSize){
    int* p1=nums;
    int* p2=nums+1;
    int i=0;
    int returnSize=1;//至少有一个元素
    for(i=0;i<numsSize-1;i++)
    {
        if(*p1!=*(p2+i))
        {
            *(++p1)=*(p2+i);
            returnSize++;
        }
    }
    return returnSize;
}

1.3 leetcode.88 合并两个有数数组

OJ链接:合并两个有序数组

解题思路:采用双指针的方式,p1用来遍历nums1数组,p2用来遍历nums2数组。

此时我们需要另外开辟一个新的数组(掌握后也可以不开),p1,p2同时前进,哪一个指针指向的值比较小,哪一个就填充到新数组里,然后该指针向后移动一位,另一个指针不动。

循环此步骤,直至两个数组中某一个数组遍历完成。

之后将未遍历完成的数组剩下的元素全部拷贝到新数组。最后一步,将新数组中的元素拷贝到nums1数组中。

解题实战:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i=0;
    int j=0;
    int arr[200]={0};
    int* p1=nums1;
    int* p2=nums2;
    int k=0;//记录arr数组里元素的个数
    if(nums2Size==0)
        return;
    while(i<nums1Size-nums2Size&&j<nums2Size)
    {
        if(p1[i]<p2[j])
        {
            arr[k]=p1[i];
            i++;
        }
        else
        {
            arr[k]=p2[j];
            j++;
        }
        k++;
    }
    if(i==nums1Size-nums2Size)
    {
        for(;j<nums2Size;j++)
        {
            arr[k++]=p2[j];
        }
    }
    if(j==nums2Size)
    {
        for(;i<nums1Size-nums2Size;i++)
        {
            arr[k++]=p1[i];
        }
    }
    for(k=0;k<nums1Size;k++)
    {
        nums1[k]=arr[k];
    }
}

2.链表题目合集


2.1 leetcode.203 移除链表元素

OJ链接:移除链表元素

解题思路:本题我采用双指针的方式(双指针并不意味着仅仅只有两个指针)。首先我们需要一个新的头结点 newhead 。newtail 指针用来记录新的链表的尾部,方便插入数据。cur指针用来遍历原链表。cur从原链表的头部开始,每当遇到不等于val的结点时,将该结点尾插到新链表。最后,只需返回newhead即可。

解题实战:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* newhead=NULL;
    struct ListNode* newtail=NULL;
    struct ListNode* cur=head;


    while(cur)
    {
        if(cur->val!=val)
        {
            //如果是首次尾插,分情况处理
            if(newtail==NULL)
            {
                newhead=newtail=cur;
            }
            //一般情况
            else
            {
                newtail->next=cur;
                newtail=cur;
            }
        }
        //保存cur->next
        struct ListNode* next=cur->next;
        cur->next=NULL;
        cur=next;
    }

    return newhead;
}

2.2 leetcode.206 反转链表

OJ链接:反转链表

解题思路:本题采用带哨兵位的方式。定义一个newhead作为哨兵位的头节点。cur用来遍历原链表。从头到尾将每一个结点都头插到新链表中。解题中所有的操作都是链表的基础操作。

解题实战:

struct ListNode* reverseList(struct ListNode* head){

    struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    newhead->next=NULL;

    struct ListNode* cur=head;

    while(cur)
    {
        struct ListNode* cur_next=cur->next;
        struct ListNode* newhead_next=newhead->next;

        newhead->next=cur;
        cur->next=newhead_next;

        cur=cur_next;
    }

    return newhead->next;
}

2.3 leetcode.876 链表的中间结点

OJ链接:链表的中间结点

解题思路:定义一个变量count用来记录链表总共的结点数。利用tail指针遍历链表,用count来控制tail的位置,在coont/2的位置处停止遍历并返回tail结点。

解题实战:

struct ListNode* middleNode(struct ListNode* head){
    
    int count=0;
    struct ListNode* tail=head;
    //统计链表长度
    while(tail)
    {
        count++;
        tail=tail->next;
    }
    int mid=count/2+1;
    tail=head;
 
    //寻找中间结点
    while(mid>1)
    {
        tail=tail->next;
        mid--;
    }

    return tail;
}

2.4 牛客 链表中倒数第k个结点

OJ链接:链表中倒数第k个结点

解题思路:与上一题思路相同,只需控制遍历链表的深度即可。

解题实战:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {

    int count = 0;
    struct ListNode* tail=pListHead;
    //统计链表的长度
    while(tail)
    {
        count++;
        tail=tail->next;
    }
    //tail从头再来
    tail=pListHead;
    int i=count-k;
    //找倒数第K个结点
    while(i>0)
    {
        tail=tail->next;
        i--;
    }
    //如果k比链表的长度还要大,则返回NULL
    if(k>count)
        return NULL;

    return tail;
}

2.5 leetcode.21 合并两个有序链表

OJ链接:合并两个有序链表

解题思路:与第3题的思路相同,分别用tail1和tail2遍历两个链表。哪个结点的val较小,就把哪一个结点尾插到新链表,直至有一个链表全部遍历完毕。最后把未遍历完毕的链表直接链接到新链表的尾部,并返回newhead->next。

解题实战:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    
    struct ListNode* newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    newhead->next=NULL;
    struct ListNode* tail=newhead;

    
    struct ListNode* tail1=list1;
    struct ListNode* tail2=list2;
    //遍历两个链表
    while(tail1&&tail2)
    {
        //哪一个结点的val较小就将哪个结点尾插到新链表
        if(tail1->val < tail2->val)
        {
            tail->next=tail1;
            tail=tail1;
            tail1=tail1->next;
        }
        else
        {
           
            tail->next=tail2;
            tail=tail2;
            tail2=tail2->next;
        }
    }

    if(tail1==NULL&&tail2==NULL)
    {
        return NULL;
    }

    if(tail1==NULL)
    {
            tail->next=tail2;
    }

    if(tail2==NULL)
    {
        tail->next=tail1;
    }

    return newhead->next;

2.6 leetcode.相交链表

OJ链接:相交链表

解题思路:与判断两个数组中有无相同元素类似。定义两个指针tailA和tailB分别遍历两个链表。采用双层循环的方式,直至找到相同的结点为止。

解题实战:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode* tailA=headA;

    while(tailA)
    {
        struct ListNode* tailB=headB;
        while(tailB)
        {
            if(tailA==tailB)
            {
                return tailA;
            }
            tailB=tailB->next;
        }
        tailA=tailA->next;
    }
    return NULL;
}

2.7 leetcode.141 环形链表

OJ链接: 环形链表 

解题思路:看到题目时,首先想到的是这与给出一个val,然后在数组中查找是否有与val值相同的元素。所以,这道题我们利用一个数组将链表的结点全部存储起来,然后查找数组中,是否有与链表的尾结点t的next结点相同的结点。因为无法确定何时到达链表的尾结点,所以,本题的精髓在于用一个变量cur来控制链表的尾,依次假设尾结点就是cur。

解题实战:

bool hasCycle(struct ListNode *head) {
    //用来存储结点
    struct ListNode* arr[10000];
    struct ListNode* cur=head;
    int i=0;

    //特殊情况特殊处理
    if(head==NULL||head->next==NULL)
        return false;

    while(cur->next)
    {
        //每经过一个结点,就添加到数组中
        arr[i]=cur;
        i++;
        //此时尾我们假设结点为cur,遍历数组是否有与cur->next相同的元素
        cur=cur->next;
        
        for(int j=0;j<i;j++)
        {
            if(arr[j]==cur->next)
                return true;
        }
    }

    return false;
}

2.8 leetcode.142 环形链表Ⅱ

OJ链接:环形链表 II 

解题思路:本题与上一题几乎没有区别,代码也几乎相同。

解题实战:

struct ListNode *detectCycle(struct ListNode *head) {

    //用来存储结点
    struct ListNode* arr[10000];
    struct ListNode* cur=head;
    int i=0;

    //特殊情况特殊处理
    if(head==NULL||head->next==NULL)
        return NULL;

    while(cur->next)
    {
        //每经过一个结点,就添加到数组中
        arr[i]=cur;
        i++;
        //此时尾我们假设结点为cur,遍历数组是否有与cur->next相同的元素
        cur=cur->next;
        
        for(int j=0;j<i;j++)
        {
            if(arr[j]==cur->next)
                return cur->next;
        }
    }

    return NULL;

2.9 复制带随机指针的链表

OJ链接:复制带随机指针的链表

解题思路:我们每复制一个结点,就将复制出的克隆体结点插入到该本体结点的后面。之后,最关键的一步是复制random指针。当我们完成第一步之后,就发现复制random指针变得十分方便。只需使每个克隆体结点的random等于本体结点的random->next。最后,在将这些克隆体结点链接起来即可。

解题实战:

struct Node* copyRandomList(struct Node* head) {

    if(head==NULL)
        return NULL;
    
    struct Node* tail=head;
    //复制每个结点并将复制出的结点插入到原来结点的后面
    while(tail)
    {
        struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
        struct Node* next=tail->next;

        tail->next=newNode;
        newNode->next=next;

        newNode->val=tail->val;
        newNode->random=tail->random;

        tail=next;
    }
    //依次修改每个结点的random指针
    tail=head;
    while(tail)
    {
        if(tail->random!=NULL)
        {
            tail->random=tail->random->next;
        }            
        tail=tail->next;
    }
    //将所有复制出的结点链接起来
    tail=head->next;
    while(tail->next)
    {
        tail->next=tail->next->next;
        tail=tail->next;
    }
    return head->next;
}

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

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

相关文章

零基础学JavaWeb开发(十七)之 mybatis(2)

5、MyBatis - 映射文件标签 5.1、映射文件的顶级元素 select&#xff1a;映射查询语句 insert&#xff1a;映射插入语句 update&#xff1a;映射更新语句 delete&#xff1a;映射删除语句 sql&#xff1a;可以重用的 sql 代码块 resultMap&#xff1a;最复杂&#xff0c…

章鱼网络 2022 虎年全回顾

全长5606字&#xff0c;预计阅读20分钟2022年对章鱼网络而言颇为特别。这是章鱼网络建设应用链多链生态历程的第一年&#xff0c;整个 Web3 行业都经历了极其糟糕的市场环境&#xff0c;但是我们在「生态建设」、「基础设施优化」、「社区治理」和「市场拓展」等都有长足进展&a…

31.Isaac教程--规划器代价

规划器代价 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录规划器代价组件入门通过应用程序图自定义成本导航本地规划器基于线性二次调节器 (LQR) 规划器。 它通过生成最小化成本函数的轨迹来工作。 不幸的是&#xff0c;没有适用于所有…

Allegro如何输出第三方网表操作指导

Allegro如何输出第三方网表操作指导 在做PCB设计的时候,会需要输第三方网表,Allegro支持快速输出第三方网表,如下图 具体操作如下 选择File选择Export

Leetcode:39. 组合总和、40. 组合总和 II(C++)

目录 39. 组合总和&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 剪枝版&#xff1a; 40. 组合总和 II&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff…

函数——“C”

各位CSDN的uu们新年快乐呀&#xff0c;祝大家越来越开心&#xff0c;越来越优秀。那行&#xff0c;让我们进入今天的正题&#xff0c;来了解了解函数&#xff0c;函数是什么&#xff0c;C语言中函数是如何分类的&#xff0c;函数参数&#xff0c;函数调用等一系列小知识点&…

文件操作详解-IO

目录 1.认识文件 2.文件的类型 3.java对文件的操作 针对文件系统操作 针对文件内容操作 字节流 字符流 字节流的使用 字符流的使用 4.文件IO小程序练习 示例1 示例2 1.认识文件 狭义的文件指的是硬盘上的文件和目录 广义的文件泛指计算机中的很多的软硬件资源,操…

3小时精通opencv(二)图片的常用操作

3小时精通opencv(二)图片的常用操作 参考视频资源:3h精通Opencv-Python 文章目录3小时精通opencv(二)图片的常用操作灰度图像高斯滤波边缘检测膨胀函数腐蚀函数整体代码灰度图像 img cv2.imread(Resources/lena.png) imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.im…

【C++】位图 | 布隆过滤器

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;哈希函数…

添加选课模块分析

1 模块需求分析 1.1 模块介绍 本模块实现了学生选课、下单支付、学习的整体流程。 网站的课程有免费和收费两种&#xff0c;对于免费课程学生选课后可直接学习&#xff0c;对于收费课程学生需要下单且支付成功方可选课、学习。 选课&#xff1a;是将课程加入我的课程表的过…

论文投稿指南——中文核心期刊推荐(水利工程)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

大展宏图、首创基于.NET 7强大内核-Zoomla!逐浪CMS v8.7.0发布

2022年底&#xff0c;微软 .NET Conf 在线活动正式开幕。作为微软开源、跨平台开发平台&#xff0c;.NET 7 现已推出首个正式版&#xff0c;这也代表微软的“统一工作”终于完成。 使用 .NET 7 可以轻松地将 .NET 7 项目容器化&#xff0c;在 GitHub 操作中设置 CI / CD 工作流…

拔高法三视图

拔高法最主要的就是俯视图&#xff0c;是三视图的根基&#xff0c;看主视图和侧视图&#xff0c;顶点位置在底面(俯视图)范围内&#xff0c;不在则不能拔高&#xff1b;俯视图有虚线不能拔高 首先标出俯视图所有结点&#xff0c;并且画出俯视图所对应的直观图。用斜二测画法 …

Spring Cloud 中的OpenFeign+Ribbon详解

1 spring cloud 远程调用没有看过的小伙伴可以点击传送门先去了解Nacos。有了Nacos做注册中心后&#xff0c;我们就可以获取其他服务的地址进行调用了。远程调用就需要用到我们今天的主角OpenFeign&#xff0c;如果被调用服务存在多个实例就需要进行负载均衡&#xff0c;负载均…

给定两个数组x和hp,长度都是N。 x数组一定是有序的,x[i]表示i号怪兽在x轴上的位置 hp数组不要求有序,hp[i]表示i号怪兽的血量

题目描述 给定两个数组x和hp&#xff0c;长度都是N。 x数组一定是有序的&#xff0c;x[i]表示i号怪兽在x轴上的位置 hp数组不要求有序&#xff0c;hp[i]表示i号怪兽的血量 为了方便起见&#xff0c;可以认为x数组和hp数组中没有负数。 再给定一个正数range&#xff0c;表示如果…

Vue 快速入门(二)

1、Vue浏览器插件安装 安装地址 https://devtools.vuejs.org/guide/installation.html下载完后&#xff0c;直接将vuejs-devtools.crx文件拖到Chrome浏览器扩展程序中去即可。如图&#xff1a; 2.安装完成后&#xff0c;试试效果&#xff0c;我们打开之前写的hello.html页面看…

32.Isaac教程--操纵运动规划

操纵运动规划 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html Isaac SDK 为机械臂的运动规划提供了以下组件&#xff1a; EndEffectorGlobalPlanner&#xff1a;使用逆运动学将末端执行器的笛卡尔目标转换为关节角度目标。 此小码可以接收笛卡尔…

云原生技能树-容器镜像制作、发布、拉取和运行

创建仓库 请在你自己的 gitcode.net 上创建一个仓库&#xff0c;命名为cloud_native_hello_py&#xff0c;目录结构如下&#xff1a; . ├── .dockerignore ├── .gitignore ├── Dockerfile ├── README.md └── src├── main.py└── requirements.txt其中 ma…

avb校验相关与块校验原理

一、启动校验流程 edk2/QcomModulePkg/Library/avb/VerifiedBoot.c DEBUG ((EFI_D_ERROR, "LoadImageAndAuth failed %r\n", Status)); in LoadImageAndAuth()edk2/QcomModulePkg/Application/LinuxLoader/LinuxLoader.c DEBUG ((EFI_D_ERROR, "LoadImageAndAu…

docker部署redis后,修改配置文件的requirepass后无效

解决方案 执行docker run命令时不要使用参数–requirepass docker部署redis流程&#xff08;问题复现&#xff09; 1. 启动redis容器 在服务器docker运行时&#xff0c;执行下列命令。&#xff08;会自动在远程仓库下载镜像&#xff09; redis: docker run \ --restartalw…