算法训练营第四天| 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 |142.环形链表II

news2024/11/17 13:39:27

24.两两交换链表中的节点

看完题后的思路

在这里插入图片描述
用两个指针pre,q指向1,2,创建一个虚拟头结点,使用尾插法插入**.难点在于初始条件的两个指针判空与终止条件的判断(奇数个节点与偶数个节点)**
初始节点判空无非三种情况,空节点,一个节点,直接使用一个判断解决
当个数是奇数时,pre指向最后一个元素,q指向空.当是偶数是,pre与q皆为空.
可以只考虑偶数情况,终止条件为两个都不为空.奇数情况菱形判断.

思路

见上面

代码

 //24.两两交换链表中的节点
    public ListNode swapPairs(ListNode head) {
        // 初始条件判断
        if(head==null||head.next==null){
            return head;
        }

        ListNode ihead=new ListNode(-1);
        ListNode pre=head,q=head.next;
        ListNode tail=ihead;
        //核心代码
        while (pre!=null&&q!=null){ //通过分析结尾情况,值考虑偶数情况
            tail.next=q;
            tail=q;
            q=q.next;
            tail.next=pre;
            tail=pre;
            pre=q;
            if (q!=null){  // 双指针执行中间的赋值情况
                q=q.next;
            }
        }
        if(pre!=null){ //考虑奇数情况
            tail.next=pre;
            tail=pre;
        }
        tail.next=null; // 尾插法最后一步,防止成环
        return ihead.next;
    }

复杂度

时间复杂度 0(n)
空间复杂度0(1)
在这里插入图片描述
看一遍代码就行,三刷可以直接过

困难/进一步优化/收获

收获

1. 本题解决了 链表中相邻双指针的初始情况判断 执行中赋值问题 循环结尾问题
2. 代码随想录上的next next.next感觉不如我的版本简洁

19.删除链表的倒数第N个节点

看完题后的思路

在这里插入图片描述
删除链表中的第导数n个节点,就要找到链表中的倒数第n+1个节点.如果链表长度为l,x为第导数n+1个节点的index,x+1+n=l,x=l-n-1.
  创建虚拟头结点可以更方便的删除头结点.

思路

见上文

代码

   //19.删除链表的倒数第N个节点
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int size=0;
        ListNode ihead=new ListNode(-1,head); // 方便输出第一个节点
        ListNode curr=head;
        while (curr!=null){
            size++;
            curr=curr.next;
        }
        if (size<n){
            return null;
        }

        int index=size-n-1; // 第一个节点,前一个index为-1
        if (index==-1){
            ihead.next=ihead.next.next;//size<n保证ihead.next不为空
            return ihead.next;
        }
        //当不是删除第一个节点时
        curr=ihead.next;
        while (index>0){
            curr=curr.next;
            index--;
        }
        curr.next=curr.next.next;
        return ihead.next;
    }

复杂度

时间复杂度 0(n)
空间复杂度 0(1)
在这里插入图片描述

困难/进一步优化/收获

收获 快慢指针法

代码随想录上提供的方案更好,使用双指针,质询要遍历链表一步就行
fast先走n步([slow,fast]之间有n+1个节点),当fast走向末尾,slow刚好在倒数第n+1个节点上.

   //快慢指针法
    public ListNode removeNthFromEnd02(ListNode head, int n) {
        ListNode ihead=new ListNode(-1,head); // 方便输出第一个节点
        ListNode fast=ihead,slow=ihead;
        while (n>0){
            if (fast==null){
                return null;// 判断当n大于链表长度
            }
            fast=fast.next;
            n--;
        }
        while (fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        slow.next=slow.next.next;
        return ihead.next;
    }

在这里插入图片描述
看一遍代码就行,三刷可以直接过

链表相交

看完题后的思路

想到了用两个指针,但是这两个指针之间的关系没有想出来

思路

在这里插入图片描述
a+c+b=b+c+a

代码

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //初始判断
        if (headA==null||headB==null){
            return null;
        }
        ListNode aCurr=headA,bCurr=headB;
        int nullNum=2;
        while (aCurr!=bCurr){
            if (aCurr.next==null){
                if (nullNum>0){
                    nullNum--;
                    aCurr=headB;
                }else {// 第三次为空,一定不相交
                    return null;
                }
            }else {
                aCurr=aCurr.next;
            }

            if (bCurr.next==null){
                if (nullNum>0){
                    nullNum--;
                    bCurr=headA;
                }else {
                    return null;
                }
            }else {
                bCurr=bCurr.next;
            }
        }
        return aCurr;
    }

复杂度

时间复杂度 0(n)
空间复杂度 0(1)
在这里插入图片描述

困难/进一步优化/收获

做链表题,第一步要先考虑初始条件,例如链表为空什么的.本题一开始未考虑空链表情况,代码不通过.
三刷可以写一遍代码

环形链表II

思路

在这里插入图片描述

代码

public class Solution {
       public ListNode detectCycle(ListNode head) {
           if(head==null){
               return null;
           }
        ListNode slow=head,fast=head;
        int bootstrap=1; //启动
        while (bootstrap>0||slow!=fast){
            if(bootstrap==1){
                bootstrap--;
            }
            slow=slow.next;
            if (fast==null||fast.next==null){
                return null;
            }
            fast=fast.next.next; // 因为有环,所以一定不会NPE
        }
        // 找到相遇点
        ListNode a=head;
        ListNode b=slow;
        while (a!=b){ // 一定会相遇
            a=a.next;
            b=b.next;
        }
        return a;
    }
}

复杂度

困难/进一步优化/收获

收获 为什么下面的循环条件会出错

     while (slow==head||slow!=fast){
             System.out.println(slow.val);
            slow=slow.next;
            if (fast==null||fast.next==null){
                return null;
            }
            fast=fast.next.next; // 因为有环,所以一定不会NPE
        }

在这里插入图片描述
可以模拟一下,上面的情形确实会陷入死循环
改进:

 ListNode slow=head,fast=head;
        int bootstrap=1; //启动
        while (bootstrap>0||slow!=fast){
            if(bootstrap==1){
                bootstrap--;
            }
            slow=slow.next;
            if (fast==null||fast.next==null){
                return null;
            }
            fast=fast.next.next; // 因为有环,所以一定不会NPE
        }

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

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

相关文章

Alluxio 2022技术干货年终大赏

2022&#xff0c;我们积累了很多应用案例&#xff0c;邀请了很多嘉宾参与了我们的社区直播活动 17场主题活动&#xff08;Alluxio Day、Meetup、Datafun Summit等&#xff09; 44位嘉宾44个主题&#xff08;来自一线大厂的实战者&#xff09; 2000分钟的分享时长&#xff08;内…

【项目实战】使用Maven打包生成jar包到指定目录

一、背景&#xff08;Maven打包存在的问题&#xff09; Maven默认打包后&#xff0c;jar文件都是生成在各自服务的target下&#xff0c;对微服务的部署不太友好&#xff0c;需要整个项目上传服务器&#xff0c;里面包含了源码 二、如何解决以上问题&#xff1f; 其实可以在打…

[激光原理与应用-63]:激光器-光学-探测光、泵浦光和种子光三种光的区别

目录 种子光 泵浦光&#xff1a; 探测光&#xff1a; 种子光 种子光是用来放大出光的&#xff0c;它的作用好比在激光中增加了受激辐射的光子数&#xff0c;因此加快放大出光。 为放大器或者其它激光器产生种子光的激光器。 种子激光器是其输出光被注入到一些放大器或者其…

类(class)-结构体(struct)-共用体(union)的异同

一、"类" 的介绍在C中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点…

10道题熟练掌握并运用链表结构算法

目录 1.牛客BM3 链表中的节点每k个一组翻转 2.BM4 合并两个排序的链表 3.BM5 合并k个已排序的链表 4.BM6 判断链表中是否有环 5.BM7 链表中环的入口结点 6.BM8 链表中倒数最后k个结点 7.BM9 删除链表的倒数第n个节点 8.BM10 两个链表的第一个公共结点 9.BM11 链表相加(…

将写好的.py/.java程序变成.exe文件

目录 一、背景 1.1、前言 1.2、说明 二、优点与缺点分析 2.1、优点 2.2、缺点 三、将.py变成.exe步骤 3.1、下载需要的库 3.2、pycharm控制台.py->.exe文件 3.3、命令行.py->.exe文件 四、.py->.exe->执行.exe可能会遇到的报错与解决办法 4.1、pyinsta…

第2章 ESP32 日志

ESP32 日志 UART配置 新建工程 查看->命令面板&#xff0c;输入esp-idf:new project&#xff0c;一路完成工程创建选择menuconfig&#xff0c;输入UART 输入UART 自定义波特率改为&#xff1a;460800 日志打印 ESP32的日志打印函数 ESP_LOGx分成5个等级&#xff1a;err…

前端笔记总结+注册登录页案例

day 1 前端开发 目的&#xff1a;开发一个平台&#xff08;网站&#xff09; 前端开发&#xff1a;HTML、CSS、JavaScript Web框架&#xff1a;接收请求并处理 - Flask、Djiango MySQL数据库&#xff1a;存储数据的地方快速上手&#xff1a;基于Flask Web框架快速搭建一个网站…

Spring Cloud Alibaba商城实战项目(day02)

四、搭建Spring Cloud Alibaba环境 4.1、简介 官方文档&#xff1a;https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html 我们所选用的组件&#xff1a; SpringCloud Alibaba - Nacos&#xff1a;注册中心&#xff08;服务发现/注册&#xf…

还不会二分查找?看这一篇就够了

目录一、整数二分1.1 二分查找模板1.1.1 寻找右边界的二分查找1.1.2 寻找左边界的二分查找1.2 应用&#xff1a;寻找元素的起始位置和终止位置二、浮点数二分2.1 浮点数二分模板2.2 应用&#xff1a;数的三次方根三、使用STL进行二分查找3.1 std::binary_search3.2 std::lower_…

27-Golang中的错误处理机制

Golang中的错误处理机制说明基本说明使用deferrecover处理上述代码错误处理机制的好处自定义错误说明 package main import ("fmt" )func test() {num1 : 10num2 : 0res : num1 / num2fmt.Println("res", res) }func fmt() {test ()fmt.Println("mai…

分享77个Java源码,总有一款适合您

Java源码 分享77个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1EhB4snvWia5eCztyfiX_2A?pwdbofo …

wish、亚马逊、ebay、沃尔玛自养号测评补单优势之分析技巧

测评补单的资源可以说是卖家非常宝贵的财富&#xff0c;通过测评补单和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;如果是做自养号还可以不用担心以后被别人牵制&#xff0c;毕竟资源掌握在自己手上&…

docker-基础实战第二课

Docker三剑客 Docker 镜像&#xff08;Image&#xff09;&#xff1a;镜像可以用来创建容器&#xff0c;一个镜像可以创建多个容器。 容器&#xff1a;容器实例就是指实际运行的实例&#xff0c;可以理解为镜像是java的类&#xff0c;容器就是new出来的对象。 仓库&#xff1a;…

elasticsearch实现基于拼音搜索

1、背景 一般情况下&#xff0c;有些搜索需求是需要根据拼音和中文来搜索的&#xff0c;那么在elasticsearch中是如何来实现基于拼音来搜索的呢&#xff1f;可以通过elasticsearch-analysis-pinyin分析器来实现。 2、安装拼音分词器 # 进入 es 的插件目录 cd /usr/local/es/…

【论文阅读 CIKM2011】Finding Dimensions for Queries

文章目录ForewordAbsMethodList ExtractionList WeightingList ClusteringDimension and Item RankingForeword This paper is from CIKM2011, so we only condier the method, not resultsThere are many papers that have not been shared. More papers can be found in: Sh…

微信小程序+阿里物联/Onenet物联+esp32搭建无服务器物联系统(一)---ESP32硬件设计开源

目录 简介 一、硬件设计开源连接 二、硬件设计解析 1、电路原理图 2、PCB版图 3、BOM资料 4、整体项目的资料连接 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08;一&#xff09; 微信小程序阿里物联平台合宙Air724UG搭建无服务器物联系统&#xff08…

uni-app canvas绘制海报流程的一些记录

绘制流程 布局定义 在我们的布局里要声明canvas的定义如下&#xff0c;可以声明class布局样式&#xff0c;width和height是必须的&#xff0c;因为如果没有就绘制不了。 canvas-id也是必须的&#xff0c;我们需要通过id找到对一个你的canvas对象&#xff0c;来做操作 <c…

公测开启!CRMEB 多商户v2.1新功能快来体验

“ 真正实现完美主义当然很困难&#xff0c;但具备追求完美主义的态度&#xff0c;就能减少错误。” ——稻盛和夫 CRMEB 多商户 v2.1公测版正式发布&#xff01;新增付费会员&#xff0c;可进行会员折扣价管理、会员福利设置&#xff1b;新增社区发布短视频&#xff0c;打造短…

Django REST framework--DRF视图

Django REST framework--DRF视图DRF视图编写常规Django视图编写视图装饰器api_view查询资源返回所有数据返回单条数据返回json格式的数据新增资源修改资源删除资源DRF视图编写 常规Django视图编写 序列化器最终的作用是为视图提供转化后的数据&#xff0c;可使用Serializer类…