当前位置: 首页 > news >正文

【LeetCode_876_2.02】快慢指针在链表中的简单应用

刷爆LeetCode系列

  • LeetCode第876题和2.02面试题:
  • github地址
  • 前言
  • 题目一:链表的中间节点
    • 题目描述
    • 题目与思路分析
    • 代码实现
  • 题目二:返回链表的倒数第k个节点
    • 题目描述
    • 题目与思路分析
    • 代码实现
  • 算法代码优化

LeetCode第876题和2.02面试题:

github地址

有梦想的电信狗

前言

本文用C++实现LeetCode876题和2.02面试题


题目一:链表的中间节点

题目描述

题目链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/

在这里插入图片描述

在这里插入图片描述


题目与思路分析

目标分析

  1. 已知单链表的头结点,找出并返回链表的中间节点
  2. 题目中给出了中间节点的定义
  3. 要求:时间复杂度为O(n),空间复杂度为O(1)

思路快慢指针

  • 快指针每次走两步,慢指针一次走一步。分别讨论总结点数为奇数偶数的情况,从而找到链表的中间节点

操作

  • 创建两个移动指针fastslow,分别代表快指针和慢指针,初始时从head开始: ListNode* slow = head, *fast = head;

  • 循环条件为 while(fast && fast->next):该循环条件保证了fast指针每次都还能再移动两步

    • 快指针每次走两步fast = fast->next->next
    • 慢指针一次走一步 slow = slow->next
  • 最终slow所在的位置即为链表的中间节点return slow

在这里插入图片描述

在这里插入图片描述

代码实现

  • 时间复杂度为O(n),空间复杂度为O(1)
class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode* slow = head, *fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}
};

题目二:返回链表的倒数第k个节点

题目描述

题目链接:https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/

在这里插入图片描述


题目与思路分析

目标分析

  1. 找出单向链表中倒数第 k 个节点。返回该节点的值
  2. 给定的 k 保证有效,意味着:1 ≤ k ≤ 链表长度head != nullptr
  3. 要求:时间复杂度为O(n),空间复杂度为O(1)

思路快慢指针

  • 快指针先走 k - 1 步,两个指针再同时移动。最终slow位置即为单向链表中倒数第 k 个节点

操作

  • 创建两个移动指针fastslow,分别代表快指针和慢指针,初始时从head开始: ListNode* slow = head, *fast = head;

  • 快指针先移动 k - 1步

while(--k)fast = fast->next;
  • 两个指针再同时移动,循环条件为 while(fast->next)
while(fast->next) {fast = fast->next;slow = slow->next;
}
  • 最终slow所在的位置即为链表的中间节点,返回return slow->val

在这里插入图片描述

代码实现

  • LeetCode保证给出的k是有效的
class Solution {
public:int kthToLast(ListNode* head, int k) {ListNode* slow = head, *fast = head;while(--k)fast = fast->next;while(fast->next) {fast = fast->next;slow = slow->next;}return slow->val;}
};
  • 牛客上也有类似的题目,但是不保证给出的k有效,因此需要做特殊处理
class Solution {
public:ListNode* NthNode(ListNode* head, int n) {if(head == nullptr || n <= 0)return nullptr;ListNode* fast = head;ListNode* slow = head;int k = n - 1;while(k--){if(fast->next == NULL)	// 此时说明 给出的 k 大于链表的长度return nullptr;fast = fast->next;}while(fast->next){fast = fast->next;slow = slow->next;}return slow;}
};

算法代码优化

  • 以上代码已足够精简,无需优化

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

http://www.dtcms.com/a/511391.html

相关文章:

  • LOOP套LOOP,双LOOP优化,效率提升近30倍
  • iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
  • 计算机毕设java中学生心理健康管理系统 中学生心理健康管理的Java平台解决方案 Java技术驱动的中学心理健康管理系统研发
  • 模重复平方计算法
  • 温州网站制作套餐.net网站开发是什么对象开发
  • Tuning——CC调试(适用高通)
  • 【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体?
  • Leetcode+Java+图论+并查集
  • 网站代备案流程图越秀网站建设推广
  • 网站 app 公众号先做哪个网站建设实践
  • SpringBoot常用内置工具类使用示例
  • Qt和ffmpeg结合打造gb28181推流/支持udp和tcp被动以及tcp主动三种方式
  • 设计模式-工厂模式:解耦对象创建的设计艺术
  • UVa 1660 Cable TV Network
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 20--PO(POM) 设计模式和用例撰写
  • 网站建设年度计划申请了域名 网站怎么建设呢
  • 《黄雀》电视剧总结
  • 云计算与服务器概述
  • 【Java Web学习 | 第1篇】前端 - HTML
  • Jenkins流水线项目发布
  • 网站优化需要做什么烟台网站建设比较大的
  • CAN入侵检测系统IDS不行,用扩充白名单机制保证汽车功能安全需求
  • 微软Teams的Media bypass的介绍
  • 分布式一致性
  • 使用微软Agent Framework .NET构建智能代理应用
  • MOSHELL (10) : COLI 交互
  • 九江网站开发wordpress适合seo
  • 【JavaScript】some方法的详解与实战
  • 买机票便宜网站建设分站式二手车网站源码
  • windows配置hadoop环境