LeetCode——链表简单题题解

news2024/9/20 12:34:58

83. 删除排序链表中的重复元素

题目描述

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
在这里插入图片描述

输入:head = [1,1,2]
输出:[1,2]

解题思路:用一个指向节点类型的指针保存头结点,用另一个指向节点类型的指针对该链表进行遍历,由于是有序的,当出现不同的值就说明不会再出现跟前面的值相同的节点了,最后循环结束的条件是遍历到最后一个节点的时候,也就是该节点的next 指向空的时候,停止循环,返回该保存的头结点,另外,如果传过来的头结点是空,则直接返回空。

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* deleteDuplicates(struct ListNode* head){

if(!head)//如果head为空直接返回
{
    return head;
}
        struct ListNode* ret = head;//保存头结点
        while(head->next!=NULL)//当head为尾节点时停下来
        {
            if(head->val!=head->next->val)//判断两个相邻节点的值是否相等,如果不相等,head就往后走
            {
               head = head->next;
                continue;
            }
            //如果想等,直接跳过这个节点,相当于删除
             head->next = head->next->next;
            
        }
        return ret;
}

141.环形链表

题目描述
给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。
在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

在这里插入图片描述

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

在这里插入图片描述

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

解题思路:
这个题我们可以用一个快慢指针来写,这里可以考虑到一个追及问题,如果该链表没有环,则快指针永远不可能和慢指针相遇,而最后会走到末尾,如果有环,那么因为快指针永远比慢指针快一步,并且他们之间是有距离的,所以一定会相遇。

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode * fast = head;
    struct ListNode * slow = head;
    while(fast&&fast->next)
    {
        slow = slow->next;//慢指针,一次走一步
        fast = fast->next->next;//快指针一次走两步
        if(slow==fast)
        {
            return true;//一旦相遇说明有环
        }
    }
    return false;
}

面试题02.07 链表相交

题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构
在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

在这里插入图片描述

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at ‘2’
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

在这里插入图片描述

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

解题思路:让pA从headA链表的头节点,pB从headB链表的头结点同时开始走,当走到空的时候就让另一条链表的头结点赋值给相应的节点,比如pA把headA都走完了还没有与pB相等,则把headB赋值给pA让pA继续走下去,同理pB从另一边这样走,就相当于如果两条链表有交点则这两条链表可以看成打了节的绳子,从一个左往右走,一个从右往左走,如果有交点,则pA和pB必然相遇,否则没有交点。

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
            if(headA==NULL||headB==NULL)
            return NULL;

            struct ListNode* pA = headA;
            struct ListNode* pB = headB;
            while(pA!=pB)
            {
                pA = pA!=NULL?  pA->next:headB;
                pB = pB!=NULL? pB->next:headA;
            }

            return pA;
}

206.反转链表

题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

有两种方法可以写

方法一:把箭头掰成指向自己前面的节点
如上图所示,很形象的其实
参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head) {
     //方法一
     if(head==NULL)
     {
         return NULL;
     }

     //初始条件
     struct ListNode *n1 = NULL,*n2 = head,*n3 = n2->next;
     //结束条件
     while(n2)
     {
         n2->next = n1;//把当前节点的下一个指向前面的那个节点,相当于形象的掰指针箭头方向
         n1 = n2;
         n2 = n3;
         if(n3)
         {
             n3 = n3->next;
         }
     }
     return n1;//走到最后的n1就是该链表的头结点

方法二:头插法
解题思路:
头插法特性:
可以把先头插的节点都可以挤到后面去,后面头插的节点放到最前面

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
     
        //方法二
        struct ListNode* cur = head;
        struct ListNode* newhead = NULL;
        while(cur)
        {
            struct ListNode* next = cur->next;
            //头插
            cur->next = newhead;
            newhead = cur;
            cur = next;
        }
        return newhead;
        
}

21.合并两个有序链表

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例二:

输入:l1 = [ ], l2 = [ ]
输出:[ ]

解题思路:
定义一个新的头节点初始化为空,用两个节点指针分别从两个有序链表的头结点开始遍历并且比较两个节点的值,一 一比较,小的直接尾插到新的头结点后面,直接遍历下去,直到其中一个链表遍历完,然后把另一个链表剩下的节点直接链接到新链表的后面,如果两个链表其中一个为空,那么就直接返回另一个链表。

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){

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

234. 回文链表

题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

在这里插入图片描述

输入:head = [1,2,2,1]
输出:true

在这里插入图片描述

输入:head = [1,2]
输出:false

解题思路:
我是通过快慢指针先找到中间节点,然后再通过调用前面的反转链表的函数,把后半部分进行反转,然后一一对比,直到比到中间节点如果还相等则为回文链表

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head){
         if(head==NULL)
            return NULL;
         struct ListNode* prev = NULL;   
        struct ListNode* cur = head;
        struct ListNode* last = cur->next;
        head->next = NULL;
        while(cur)
        {
            cur->next = prev;
            prev = cur;
            cur = last;
            if(last)
            {
                last = last->next;
            }
        }
        return prev;

}

bool isPalindrome(struct ListNode* head){
        if(head==NULL||head->next==NULL)
            return true; 
        struct ListNode* low = head;
        struct ListNode* fast = head;
        if((low->next->next)==NULL)
        {
            if(low->val!=low->next->val)
            {
                return false;
            }
            else
            return true;
        }
        while((fast!=NULL)&&(fast->next!=NULL))
        {
            low = low->next;
            fast = fast->next->next;
        }
        struct ListNode* cur = low;
       struct ListNode* newhead =  reverseList(cur);
       while(newhead!=low->next)
       {
           if(newhead->val!=head->val)
           {
               return false;
           }
           head = head->next;
           newhead = newhead->next;
       }
       return true;

}

面试题 02.02. 返回倒数第 k 个节点

题目描述
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

解题思路:定义一个快慢指针先让快指针从头走k步到第k个节点,然后再让慢指针从头开始走,直到快指针走到最后一个空节点为止
相当于快指针先走了k步,然后快指针又走了链表长度-k次,其实这个步数也就是慢指针走的步数,也就是链表的倒数第k个节点

参考代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


int kthToLast(struct ListNode* head, int k){

        struct ListNode* fast = head;
        struct ListNode* low = head;

        while(k--)
        {
            fast = fast->next;
        }

        while(fast)
        {
            fast = fast->next;
            low = low->next;
        }

        return low->val;
}

总结

真的,不说别的,咋们就是说是不是链表这块动不动就用快慢指针,把快慢指针学会并且灵活应用,解答链表题对你会有很大帮助。

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

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

相关文章

Vscode配置C/C++开发环境

下载Vscode进行安装。 下载MinGW-W64 GCC最新版本&#xff0c; 选择x86_64-win32-seh进行下载。解压放入自定义目录&#xff08;英文路径&#xff09;后&#xff0c;添加$:\mingw64\bin到系统Path环境变量。安装C/C插件。 在.c后缀文件中按Ctr Shift P&#xff0c;选择C/C …

Windows系统文件被faust勒索病毒加密勒索病毒解密恢复,电脑中病毒了怎么修复?

恶意软件的攻击已经让电脑用户变得更加谨慎了。在最近的一波攻击中&#xff0c;faust勒索病毒已经对使用Windows系统的计算机造成了广泛的破坏。该病毒利用加密技术锁定用户的文件&#xff0c;只有在支付一定数额的赎金后才会解锁这些文件。如果你的计算机中也受到了这种勒索病…

MaxScript编写bone转换biped工具

一、制作转换工具的缘由 大家好&#xff0c;我是阿赵。我经常从各种渠道得到了一些角色模型&#xff0c;这些模型得到之后&#xff0c;会发现是带有蒙皮和骨骼&#xff0c;甚至带有动作的。   不过这些资源很多都是从游戏截取出来的&#xff0c;导入到3DsMax之后&#xff0c;…

信息安全复习十:Web与电子商务安全

一、章节梗概 1.信息安全的学科内容 2.Web和电子商务安全问题提出 3.安全套接字协议SSL与传输层安全协议TLS 4.安全电子交易(SET)简要介绍 复习&#xff1a; 密码学内容&#xff1a;对称密钥密码、公开密钥密码、报文鉴别 PKI&#xff1a;数字签名、数字证书、信任关系 身份认…

MES管理系统助力企业数字化与实体经济实现“数实融合“

中国企业评估协会日前公布了2022年度“中国新经济500强”的名单。在这些企业中&#xff0c;先进制造业企业的比例超过了半数&#xff0c;尤其是互联网与现代信息技术服务业、新能源产业、新型生活性服务业等&#xff0c;在这些行业中占据了重要地位。由此可以看出&#xff0c;绿…

C/C++每日一练(20230427) 二叉树专场(5)

目录 1. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 2. 从先序与中序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每…

微信小程序php+python+nodejs+vue 高校工资管理系统

在线公益知识练习及测试系统是随着计算机技术和互联网技术的发展而产生的一种的新的练习及测试模式&#xff0c;与传统的纸质化练习及测试不同&#xff0c;在线系统提高了练习或测试的效率&#xff0c;减少了纸张的浪费&#xff0c;减轻了教师的评卷压力&#xff0c;同时也为参…

易观千帆 | 金融机构如何保证用户体验长期可持续?

易观&#xff1a;用户体验正逐渐成为金融机构的命脉。 数字经济时代的到来&#xff0c;金融机构面临着来自内部和外部的双重压力。一方面&#xff0c;互联网金融企业凭借强大的技术能力以及人才优势&#xff0c;通过互联网运营的模式迅速响应客户需求&#xff0c;吸引了大量用户…

自定义Feign日志

文章目录 开篇定位Feign是怎么打印日志的&#xff1f;自定义FeignLogger实现 开篇 在上一篇Feign打印日志文章中&#xff0c;已经成功打印了FeignClient请求服务的日志信息&#xff0c;但是默认打印的日志太过零散&#xff0c;不是我们想要的。怎么能自定义日志打印的格式和内…

系统分析师《企业信息化战略与实施》高频知识点二

企业信息化战略与实施---系统建模 组织结构是一个企业内部部门的划分以及相互之间的关系&#xff0c;每个企业都有自己的组织结构图&#xff0c;它将企业分成若干部分&#xff0c;标明行政隶属关系。组织结构图是一种树结构&#xff0c;树的分支是根据上下级和行政隶属关系绘制…

二叉树 + 技巧

题目难度备注2471. 逐层排序二叉树所需的最少操作数目1635BFS 置换环 离散化2641. 二叉树的堂兄弟节点 II1677BFS 文章目录 周赛二叉树问题[2471. 逐层排序二叉树所需的最少操作数目](https://leetcode.cn/problems/minimum-number-of-operations-to-sort-a-binary-tree-by-l…

【AI绘画】云服务器部署stable-diffusion-webui保姆级教程

1.背景 之前给大家写过Mac苹果笔记本上部署stable-diffusion-webui的教程&#xff0c;知乎链接&#xff1a; 【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程 但是安装过程就花了一天的时间&#xff0c;各种问题处理起来真是苦不堪言。。。而且…

如何解决生产缺料问题?

对于一个生产型企业来说&#xff0c;生产缺料是管理中的疑难问题之一。 生产缺料导致的最直接的危害就有两个&#xff1a; 第一就是不能准时交货&#xff0c;降低企业信用&#xff0c;情况严重可能导致根据合同赔款&#xff0c;甚至丢失客户。 第二个危害就是增加了生产成本…

部署LVS-DR 集群及实验

一、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一种工作模式。 #①LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff1b; #②节点 Directo…

ueditor富文本编辑器上传木马图片或木马文件漏洞

漏洞分析&#xff1a; ueditor插件目录一般都自带index.html文件&#xff08;完整demo文件&#xff09;&#xff0c;这个文件原来是用来测试插件功能的&#xff0c;但粗心的程序员们&#xff0c;开发好项目后&#xff0c;都忘记删除这个demo文件了&#xff0c;导致黑客可以很轻…

微服务不是本地部署的最佳选择,不妨试试模块化单体

微服务仅适用于成熟产品 关于从头开始使用微服务&#xff0c;马丁・福勒&#xff08;Martin Fowler&#xff09;总结道&#xff1a; 1. 几乎所有成功的微服务都是从一个过于庞大而不得不拆分的单体应用开始的。 2. 几乎所有从头开始以微服务构建的系统&#xff0c;最后都会因…

win11安装双系统ubuntu20.04指导

目录 一、制作U盘启动盘二、硬盘分区2.1方法2.2分区过程 三、安装系统3.1进入U盘启动3.2安装ubuntu3.3设置启动项 四、更新软件五、遇到的问题5.1不能连接WIFI 电脑型号&#xff1a;联想拯救者Y7000P 2023 无线网卡型号&#xff1a;WIFI 6E AX211 160MHz 系统版本&#xff1a;w…

借助尾号限行 API 实现限行规则应用的设计思路分析

引言 尾号限行是指根据车牌号的末尾数字&#xff0c;规定某些时段内不能在特定区域行驶&#xff0c;这是城市交通管理的一种措施。尾号限行政策的实施可以缓解城市交通拥堵问题&#xff0c;减少环境污染和交通事故等问题。 尾号限行 API 是一种提供已知所有执行限行政策的城市…

iSulad+Kuasar:管理面资源消耗锐减 99%的新一代统一容器运行时解决方案

随着云计算和容器技术的不断发展&#xff0c;容器引擎和容器运行时已经成为了云原生时代的基石&#xff0c;它们负责了容器生命周期的管理以及容器运行过程中环境的创建和资源的配置。openEuler 社区基于容器引擎项目 iSulad[1]在解决容器运行效率、安全性以及隔离性等问题上进…

DVWD-Command Injection Low/Medium/High低中高级别

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Command Injection 一、Low级别二、Medium级别三、High级别 命令注入这关是一个Ping测试功…