《剑指offer》– 链表中倒数第k个节点、反转链表、合并两个排序的链表

news2025/2/2 12:44:13

一、链表中倒数时第k个节点:

1、题目:

输入一个链表,输出该链表中倒数第k个结点。

2、解题思路:单链表具有单向移动的特性。

(1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第count-k个节点。但是要注意,可能链表节点数count小于k,此时要返回NULL,所以要先判断这个条件。(这一种就不贴代码出来了)

(2)第二种:

可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1,这样,当第一个指针的next==NULL,也就是走到最后一个节点的时候,第二个指针对应的位置,就是倒数第k个结点。

这样的好处是能够节省一个循环,时间复杂度会相应降低。从Q(2N) 到Q(N)

注意,但是需要一个小循环让第一个指针先走到第k个指针。同时也存在结点总数小于k的问题,如果循环还没有进行到k次,而第一个指针的已经是NULL,即走到头了,那么,函数返回NULL。

3、代码实现:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {

        if(head ==null || k<=0){
            return null;
        }
        ListNode last=head;
        
        //第一个指针先移动k-1个节点
        for(int i=0;i<k-1;i++){
            if(head.next!=null){
                head=head.next;
            }else{
                return null;
            }
        }
        //同时移动两个指针,当第一个指针指向null的时候,last就是所求的结点
        while(head.next!=null){
            head=head.next;
            last=last.next;
        }
        
        return last;
    }
}

二、反转链表:

参考博客:https://www.jianshu.com/p/e385d9c06672

1、题目:

输入一个链表,反转链表后,输出新链表的表头。

2、解题思路:

2-1:第一种:使用递归方式:

(1)解题思路:

假设链表为[1,2,3,4,5]先迭代到链表末尾5,然后从5开始依次反转整个链表。 如下图所示,先迭代待最后一位5,并且设置一个新的节点newList作为反转后链表的头结点,由于整个链表反转后的头就是最后一个数,所以newList存放的一直是反转后的头结点的地址,将head指向的地址赋值给head->next->next指针,并且一定要记得让head->next =NULL,也就是断开现在指针的链接,否则新的链表形成了环,下一层head->next->next赋值的时候会覆盖后续的值。依次反转。。

(2)代码实现:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        //递归方式
        if(head==null || head.next==null){
            return head;
        }
        ListNode newList=ReverseList(head.next);
        head.next.next=head;
        head.next=null;
        
        return newList;
    }
}

2-2第二种:使用迭代方式:

(1)解题思路:

先给定一个空的链表newList,然后判断传入的链表head是不是空链表或者链表元素只有一个,如果是,直接返回就可以。如果不是,则对链表进行迭代,然后给一个临时变量temp存储head.next,然后改变head.next的指向newList,然后把head赋值给newList,接着让head等于临时变量temp,就这样一直迭代完整个链表,返回newList就可以。如下图所示:

(2)代码实现:

 public ListNode ReverseList(ListNode head) {
        
        //非递归方式:
        ListNode newList=null;
        if(head==null || head.next==null){
            return head;
        }
        
        while(head!=null){
            ListNode temp=head.next;
            head.next=newList;
            newList=head;
            head=temp;
        }
        return newList;
    }

三、合并两个排序的链表:

参考博客:https://blog.csdn.net/qq_23217629/article/details/51730312

1、题目:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

2、解题思路:

比较两个链表的第一个节点,取出最小值的节点,接着再按照相同的方式重复比较剩余链表的节点。

3、代码实现:

public class Solution {
    public ListNode Merge1(ListNode list1, ListNode list2) {
            //递归版本
			ListNode head;
			if (list1 == null) {
				return list2;
			}
			if (list2 == null) {
				return list1;
			}
			if (list1.val < list2.val) {
				head = list1;
				head.next = Merge(list1.next, list2);
			} else {
				head = list2;
				head.next = Merge(list1, list2.next);
			}
			return head;
		}

    public ListNode Merge(ListNode list1,ListNode list2) {
		//非递归版本:
		ListNode head = new ListNode(-1);//头节点,用来存储合并的链表
		head.next = null;
		ListNode root = head;//root暂存我新建的头节点,合并之后返回root.next,就是题目给的头节点
		
		while(list1!=null && list2!=null){
			if(list1.val <=list2.val){
				head.next=list1;
				head = list1;
				list1 = list1.next;
			}else{
				head.next=list2;
				head=list2;
				list2=list2.next;
			}
		}
		
		//把未结束的链表连接到合并后的链表尾部
		if(list1 !=null){
			head.next=list1;
		}
		if(list2 !=null){
			head.next=list2;
		}
		
		return root.next;
    }
}

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

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

相关文章

计算机毕设Python+Vue学生用品采购系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

我国风电行业发展现状:并网装机容量持续增长 产业集中化趋势明显

根据观研报告网发布的《2022年中国风电行业分析报告-行业全景评估与投资规划分析》显示&#xff0c;风电是一种清洁、绿色的可再生能源。风力发电是能源领域中技术最成熟、最具规模开发条件和商业化发展前景的发电方式之一。发展风力发电对于解决能源危机、减轻环境污染、调整能…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day13

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三明年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

【1760. 袋子里最少数目的球】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#…

开发板到货记录一波

今天在终于拿到了期待已久的开发板RK3568&#xff0c;来&#xff0c;亮个相吧&#xff01;&#xff01;&#xff01; 开发板资源还是相当丰富的&#xff0c;对于学习安卓&Linux都是非常友好的&#xff0c;开发板默认安装的是安卓11系统&#xff0c;由于经费问题目前还没有…

小米发明“永动机”:走路即可为智能设备充电

蓝牙耳机、智能智能手表、智能手环、智能眼镜、智能手机……随着科技的进步&#xff0c;越来越多的移动与可穿戴智能设备开始走进我们的生活&#xff0c;智能设备在给人们生活带来便利的同时&#xff0c;也带来了一些困惑&#xff0c;越来越多诸如手环、TWS耳机等智能穿戴设备&…

火热的元宇宙,成为未来趋势

近年来&#xff0c;中国在算力上突飞猛进&#xff0c;有望成为世界顶尖&#xff0c;再加数据和算法上的优势&#xff0c;中国就很有可能在元宇宙方面率先开发出原创性的技术&#xff0c;从而实现从“0”到“1”的突破。 元宇宙办公 在未来的元宇宙畅想中&#xff0c;人们不仅…

java Lambda表达式的标准格式及其前提带有(代码演示)

观看本文 首先 你要对Lambda的概念有个基本了解 对此 您可以先查看我的文章 java Lambda概念 通过实现线程简单体验一下Lambda表达式 跟着上一篇文章做 你的代码会是这样 new Thread( () ->{System.out.println("执行线程"); } ).start();而其中Lambda 表达式 则…

资产种类多数量大、使用地点分散?集中管理,一招搞定

随着银行规模不断壮大&#xff0c;资产数量也随之不断增加&#xff0c;同时银行资产具有总量大、价值高、使用地点分散、管理难度大的特点&#xff0c;IT资产、房产、办公用品、维修保养需求随着业务的快速增长对管理工作带来了压力。 传统资产管理4大痛点 01.账实不符 实物账…

【Python机器学习】神经网络中常用激活函数、损失函数、优化方法(图文解释 附源码)

下面以经典的分类任务&#xff1a;MNIST手写数字识别&#xff0c;采用全连接层神经网络 MNIST数据集是一个手写体的数字图片集&#xff0c;它包含有训练集和测试集&#xff0c;由250个人手写的数字构成。训练集包含60000个样本&#xff0c;测试集包含10000个样本。每个样本包括…

数据结构基础--散列表

一、散列简介 散列表&#xff0c;又叫哈希表&#xff08;Hash Table&#xff09;&#xff0c;是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。也就是说&#xff0c;把关键字映射到一个表中的位置来直接访问记录&#xff0c;以加快访问速度。 通常&#xff0…

Android设计模式详解之建造者模式

前言 Builder模式是一种创建型设计模式。 定义&#xff1a;将一个复杂对象的创建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 使用场景&#xff1a; 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时&#xff1b;多个部件或零…

java学习day63(乐友商城)商品新增后台、商品编辑后台、搭建前台系统页面

1.商品新增 当我们点击新增商品按钮&#xff1a; 就会出现一个弹窗&#xff1a; 里面把商品的数据分为了4部分来填写&#xff1a; 基本信息&#xff1a;主要是一些简单的文本数据&#xff0c;包含了SPU和SpuDetail的部分数据&#xff0c;如 商品分类&#xff1a;是SPU中的cid1&…

大型项目都会使用到的Makefile

一、vi编辑器之神 1.vi编辑器的三种模式&#xff1a; 插入模式&#xff1a;可以编辑文档 编辑模式&#xff1a;可以敲一些命令&#xff0c;执行例如复制n行 剪切n行 &#xff0c;粘贴等功能 命令模式:(最后一行模式&#xff09; 在此模式下可以保存文件&#xff0c;退出vi…

第03讲:Redis的持久化方案

前言 redis是一个内存数据库&#xff0c;当redis服务器重启&#xff0c;获取电脑重启&#xff0c;数据会丢失&#xff0c;我们可以将redis内存中的数据持久化保存到硬盘的文件中。 redis提供两种持久化方式: RDB&#xff1a;快照&#xff0c;通过从服务器保存和持久化AOF&…

Codeforces Round #839 (Div. 3) A~G all answer

Dashboard - Codeforces Round #839 (Div. 3) - Codeforces 最近状态奇差无比&#xff0c;还有点生病&#xff0c;低烧反复横跳&#xff0c;应该没阳&#xff1f;&#xff08;虽然家人都阳了&#xff0c;就剩我一个了wuwuwu&#xff5e;&#xff08;A B C就不作解释了&#xff…

【小5聊】Python3 使用selenium模块实现简单爬虫系列一

第一次听说Python还是在工作的时候&#xff0c;还是一位女生在用&#xff0c;当时她说可以用来处理excel文档&#xff0c;特别是一些统计分析。第二次让我真正进入python世界&#xff0c;还是在一次C站举办的大赛上。聊聊你是因为什么机缘巧合进入到python圈的呢&#xff1f;不…

金盾杯2022-AGCTFS战队 wp

文章目录Web图书馆EzPHPeZphp2SQLSkip有来无回反败为胜Crypto小菜一碟RRSSAAsimpleRrandMISC盗梦空间qianda0_Sudoku数据泄露01-账号泄露追踪数据泄露02-泄露的密码数据泄露03-泄露的密钥ReverseTeaPwnLoginWtfWeb 图书馆 根据提示找到 干货&#xff5c;最全的Tomcat漏洞复现…

Qt5 网页标题、关键词提取工具Findyou

Qt5 网页标题、关键词提取工具Findyou 一、程序运行 运行界面 辅助功能&#xff0c;可用于将扫描器的扫描结果转换为url 二、所涉及的重要知识点 1、Qt爬取https的网页 来自宇龍_ https://blog.csdn.net/qq_45809384/article/details/122049295?spm1001.2014.3001.5506 打…

Foxmail客户端添加163账号和邮件备份163邮箱

文章目录一、Foxmail添加163账号1. 点击图标2. 账号管理3. 新建4. 手动设置5. 填写信息6. 创建二、邮件转移备份2.1. 邮件折叠2.2. 选择目标邮箱2.3. 同步服务端Foxmail客户端添加163账号的具体步骤如下&#xff1a;一、Foxmail添加163账号 1. 点击图标 首先打开Foxmail客户端…