【剑指offer】19. 链表中倒数最后k个结点(java)

news2024/11/25 4:51:57

文章目录

  • 链表中倒数最后k个结点
    • 描述
    • 示例1
    • 示例2
    • 思路
    • 完整代码

链表中倒数最后k个结点

描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。

数据范围: 0 ≤ n ≤ 1 0 5 0≤n≤10^5 0n105 0 ≤ a i ≤ 1 0 9 0≤a_i≤10^9 0ai109 0 ≤ k ≤ 1 0 9 0≤k≤10^9 0k109

要求:空间复杂度 O ( n ) O(n) O(n),时间复杂度 O ( n ) O(n) O(n)

进阶:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( n ) O(n) O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

img

其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

示例1

输入:

{1,2,3,4,5},2

返回值:

{4,5}

说明:

返回倒数第2个节点4,系统会打印后面所有的节点来比较。 

示例2

输入:

{2},8

返回值:

{}

思路

其实看到题目的基本和进阶要求就可以知道需要用什么办法了

主要思路如下:

  • 初始化结果链表res等于题目给的pHead,并且创建变量来记录其链表长度
  • 接着使用循环来获得链表长度
  • 若链表长度小于k,则说明无法找到倒数第k个节点,直接返回pHead,因为此时pHead为空
  • 若长度大于等于k,则对res链表进行len-k次遍历,就可以找到倒数第k个节点
  • 接着返回res即可
public ListNode FindKthToTail (ListNode pHead, int k) {
    // write code here
    int len = 0;
    ListNode res = pHead;
    while (pHead != null) {
        len++;
        pHead = pHead.next;
    }
    if (len < k) {
        return pHead;
    } else {
        for (int i = 0; i < len - k; i++) {
            res = res.next;
        }
    }
    return res;
}

之前我一直以为上一种方法的空间复杂度为 O ( n ) O(n) O(n),因为创建了长度为len的链表res,但后面看了别人的解法才发现这种常数级指针变量,无额外辅助空间使用,所以空间复杂度为 O ( 1 ) O(1) O(1)

然后看了一下别人的解法,发现一个双指针的解法也很巧妙

进阶的方法需要使用两个指针,第一个指针与第二个指针的距离为k,主要思路如下:

  • 第一个指针先遍历k次
    • 如果还没遍历完k次就为空,说明其链表长度小于k,返回null
    • 如果遍历完毕不为空,说明链表长度大于等于k
  • 接着两个指针同时遍历,此时两指针之间距离为k
  • 当第一个指针到达链表末尾时,第二个指针正好在倒数第k个节点的位置
  • 返回第二个指针指向的节点
public ListNode FindKthToTail (ListNode pHead, int k) {
    // write code here
    ListNode pre = pHead;
    ListNode res = pHead;

    for (int i = 0; i < k; i++) {
        if (pre == null) {
            return pre;
        } else {
            pre = pre.next;
        }
    }
    while (pre != null) {
        pre = pre.next;
        res = res.next;
    }
    return res;
}

完整代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pHead ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode FindKthToTail (ListNode pHead, int k) {
        // write code here
        ListNode pre = pHead;
        ListNode res = pHead;

        for (int i = 0; i < k; i++) {
            if (pre == null) {
                return pre;
            } else {
                pre = pre.next;
            }
        }
        while (pre != null) {
            pre = pre.next;
            res = res.next;
        }
        return res;
    }
}

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

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

相关文章

【软件测试】在Windows环境安装Docker(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 下载和安装 1、地…

免费内网穿透方案twingate搭建,适用pve,exsi等虚拟机访问场景

最近学习devops环境搭建&#xff0c;其中需要安装很多中间件和虚拟机&#xff0c;之前黑裙和pve都用的zerotier,可以点对点通信&#xff0c;但是机器多了就要一台一台去部署比较费力&#xff0c;而且在使用过程中发现&#xff0c;pve的容器和pve宿主机的出口IP是一样的&#xf…

聊聊微服务 架构思想

用了好多年微服务架构了&#xff0c;我经常会反思&#xff0c;这个项目为啥用微服务&#xff1f;真的能帮我们解决一些痛点吗&#xff1f;这个项目有必要用微服务吗&#xff1f;这个项目体现出微服务的价值了吗&#xff1f; 我是从2017年开始入手微服务&#xff0c;距今已经五六…

从小白到大神之路之学习运维第59天--------inotify+rsync同步和实时同步(单台同步和多台同步)

第三阶段基础 时 间&#xff1a;2023年7月13日 参加人&#xff1a;全班人员 内 容&#xff1a; inotifyrsync同步和实时同步 目录 一、rsync远程同步 二、源端到发起端同步 安装部署&#xff1a; 源端&#xff08;服务端&#xff09;&#xff1a; &#xff08;单台…

ROS安装注意事项

输入roscore报错&#xff1a;"roscore" not found 输入 sudo apt install ros-​melodi​c-roslaunch​

概率论的学习和整理17:EXCEL里直接对应的分布公式计算概率

1EXCEL计算这些特殊分布的方差 1.1 用原始的概率&#xff0c;期望和方差的方法 虽然计算概率&#xff0c;需要用对应分布的公式P(xn) 想了解的随机变量是总次数n&#xff0c;需要对应几何分布&#xff0c;负二项分布P(xk) 想了解的随机变量是成功次数k&#xff0c;需要对应超几…

【Spring】注解读取和存储Bean对象(下)

三、Spring 获取 bean 对象 获取 bean 对象也叫 “对象装配”&#xff0c;“对象注入”&#xff0c; 意思就是把对象取出来放到某个类中。 对象装配&#xff08;对象注入&#xff09;的实现有以下三种方法&#xff1a; 1. 属性注入 2. 构造方法注入 3. Setter 注入 接下来…

【Unity面试篇】Unity 面试题总结甄选 |Unity进阶篇 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新…

总结926

总结&#xff1a;今晚状态极佳&#xff0c;回去路上差点被宿管阿姨锁在楼下。之前每每学到晚上脑子都转不动了&#xff0c;不过今晚就像是适应了一样。这也说明&#xff0c;学习&#xff0c;是可以上瘾的。只要循序渐进&#xff0c;步步为营&#xff0c;就不断收获学习的乐趣。…

解决uniapp运行手机基座出现的问题

常见的问题&#xff1a;&#xff08;往往在更新编辑器版本后会出现以下问题&#xff09; 问题1.明明已经连接到手机&#xff0c;就是检测不到设备 问题2.同步资源失败&#xff0c;未得到同步资源的授权 解决办法汇总 问题1解决办法&#xff1a; 方法一&#xff1a;进入HBuild…

关系型数据库范式

范式 前置知识第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;BC范式&#xff08;BCNF&#xff09;第四范式&#xff08;4NF&#xff09;范式化设计和反范式化设计的优缺点&#xff1f; 前置知识 超键(super key)…

mq延时队列使用

一、基本配置 导入依赖 <!--高级消息队列协议amqp--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>application.yml配置 #rabbitmqrabbitmq:host: 192…

02 半同步半反应堆线程池

服务器编程基本框架 主要由I/O单元&#xff0c;逻辑单元和网络存储单元组成&#xff0c;其中每个单元之间通过请求队列进行通信&#xff0c;从而协同完成任务。 其中I/O单元用于处理客户端连接&#xff0c;读写网络数据&#xff1b;逻辑单元用于处理业务逻辑的线程&#xff1b…

ES7~ES13新特性(二)

1 ES7新增特性解析 2 ES8新增特性解析 3 ES10新增特性解析 4 ES11新增特性解析 5 ES12新增特性解析 6 ES13新增特性解析 ES8-对象相关的属性 ---entries的使用 const obj {name: "why",age: 18,height: 1.88,address: "广州市"}// 1.获取所有的keyco…

【NLP】Transformer模型原理(2)

接上文 【NLP】Transformer模型原理(1) 六、零层的transformer 观看涵盖与本节类似内容的视频:0 层理论 在进入更复杂的模型之前,简要考虑一下“零层”变压器很有用。这样的模型获取一个令牌,嵌入它,解嵌它以生成预测下一个令牌的对数: ​

音频数据分割单独处理后再拼接出现跳跃间断点的处理方法

+hezkz17进数字音频系统研究开发交流答疑 1如图所示 问题1: 对于一个81920字节的音频文件,如果是分割成小块4096输入(无重叠,均分),在频域上做去噪算法,每4k数据返回到时域上再拼接成80k的处理结果文件,发现处理结果有异常有跳跃间断点,像是频谱泄露?分割也需要有重…

mysql函数练习

创建表sch 向表中加入数据 1、创建一个可以统计表格内记录条数的存储函数 &#xff0c;函数名为count_sch() CREATE DEFINERroot% FUNCTION count_sch() RETURNS int(11) BEGINDECLARE total INT DEFAULT 0;#Routine body goes here...SELECT count(1) into total from sch;IN…

Linux->初识计算机网络

目录 前言&#xff1a; 1 网络发展背景 2 协议 2.1 网络协议初识 2.2 协议分层 2.3 OSI、TCP/IP层状模型 2.4 协议和操作系统的关系 2.5 根据协议栈的通信 3 网络中的地址管理 前言&#xff1a; 本篇当中没有任何关于网络编程的讲解&#xff0c;全部是对网络的宏观理解…

Go语言github.com/gorilla/websocket框架websocket协议通信实战

websocket是实际开发中比较常用的应用层协议&#xff0c;本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 1.下载github.com…

【UI自动化测试】appium+python+unittest+HTMLRunner

进阶Python接口自动化测试必备教程&#xff08;2023全网最详细&#xff09; 简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自…