day04 两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表Ⅱ

news2024/11/15 7:11:23

题目1:24  两两交换链表中的节点

题目链接:24 两两交换链表中的节点

题意

两两交换链表中相邻的节点,返回交换后链表的头节点

虚拟头节点

注意终止条件,考虑节点的奇偶数,根据奇偶数确定终止条件

注意定义中间变量,temp  temp1,节点的指向改变时,使用中间变量保存以前指向的节点,以便后续的链表查询操作

完整操作1

代码1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode* cur = dummyhead;//头节点交换时,要知道其前一个节点(dummyhead),所以cur=dummyhead
        while(cur->next!=NULL && cur->next->next!=NULL){
            ListNode* temp = cur->next;
            cur->next = cur->next->next;
            ListNode* temp1 = cur->next->next;
            cur->next->next = temp;
            temp->next = temp1;
            cur = cur->next->next;
        }
        return dummyhead->next;  
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

完整操作2(先将上述分析的需要定义的中间变量全部提前定义好)

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode* cur = dummyhead;//头节点交换时,要知道其前一个节点(dummyhead),所以cur=dummyhead
        while(cur->next!=NULL && cur->next->next!=NULL){
            ListNode* temp = cur->next;
            ListNode* temp1 = cur->next->next->next;
            cur->next = cur->next->next;
            cur->next->next = temp;
            temp->next = temp1;
            cur = cur->next->next;
        }
        return dummyhead->next;  
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

题目2:19  删除链表的倒数第N个节点

题目链接:19 删除链表的倒数第N个节点

题意

删除链表中的倒数第n个节点,返回链表的头节点

虚拟头节点

先让fast走n+1步,然后fast和slow再同时移动,这样slow就会到达要删除节点的前一个节点

伪代码

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode* fast = dummyhead;
        ListNode* slow = dummyhead;
        n++;
        while(n && fast!=NULL){
            fast = fast->next;
            n--;
        }
        while(fast!=NULL){
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* tmp = slow->next;//定义临时变量,用于释放内存
        slow->next = slow->next->next;
        delete tmp;
        return dummyhead->next;

    }
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

题目3:链表相交

题目链接:链表相交

题意

找到两个单链表相交的起始节点;如果没有交点,则返回NULL

注意交点不是数值相等,而是指针相等

步骤

①  链表A定义一个curA指针  curA=headA;  链表B定义一个curB指针 curB=headB

② 链表A的长度lenA   链表B的长度lenB  

③  lenA 与 lenB 的差gap

将curA移动gap步  此时curA与curB在相同的位置处(到链表末尾的距离相等)

curA与curB一同移动 若curA==curB 返回curA  否则,一直移动curA和curB

curA==NULL 代表curA与curB还是不相等,则返回NULL

代码1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0;
        int lenB = 0;
        while(curA!=NULL){
            curA = curA->next;
            lenA++;
        }
        while(curB!=NULL){
            curB = curB->next;
            lenB++;
        }
        cout<<lenA<<endl;
        cout<<lenB<<endl;
        //此时curA  curB已经移动到了NULL位置,将curA curB重新指向head处
        curA = headA;
        curB = headB;
        //求解长度差
        //首先使得A是最长的链表
        if(lenB > lenA){
            swap(lenA,lenB);
            swap(curA,curB);
        }
        cout<<lenA<<endl;
        cout<<lenB<<endl;
        int gap = lenA - lenB;
        //将curA移动到与链表B对齐的位置
        while(gap){
            curA = curA->next;
            gap--;
        }
        //这样curA与curB在同一长度处
        while(curA!=NULL && curA!=curB){
            curA=curA->next;
            curB=curB->next;
        }
        if(curA!=NULL){
            return curA;
        }
        else{
            return NULL;
        }



        
    }
};

代码2

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0;
        int lenB = 0;
        while(curA!=NULL){
            curA = curA->next;
            lenA++;
        }
        while(curB!=NULL){
            curB = curB->next;
            lenB++;
        }
        //此时curA  curB已经移动到了NULL位置,将curA curB重新指向head处
        curA = headA;
        curB = headB;
        //求解长度差
        //首先使得A是最长的链表
        if(lenB > lenA){
            swap(lenA,lenB);
            swap(curA,curB);
        }
        int gap = lenA - lenB;
        //将curA移动到与链表B对齐的位置
        while(gap){
            curA = curA->next;
            gap--;
        }
        //这样curA与curB在同一长度处
        while(curA!=NULL){
            if(curA==curB){
                return curA;
            }
            curA=curA->next;
            curB=curB->next;
        }  
        return NULL;
    }
};
  • 时间复杂度:O(n + m)
  • 空间复杂度:O(1)

题目4:142  环形链表Ⅱ

题目链接:142 环形链表Ⅱ

题意

判断链表有无环,有环的话则返回开始入环的第一个节点;无环则返回null

主要分两个步骤:

①判断有环  无环

使用fast  slow两个指针,fast每次走两个节点,slow每次走1个节点,若有环,则fast,slow一定会在环内相遇  因为相对于slow,fast是每次走1个节点靠近slow,所以一定会和slow重合

②有环的话,返回入环的第一个节点;无环的话,返回null

fast,slow相遇时,fast走过的节点数为x+y+n(y+z),slow走过的节点数为x+y

fast走过的节点数=2*slow走过的节点数   n>=1  

伪代码

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast!=NULL && fast->next!=NULL){
            fast = fast->next->next;
            slow = slow->next;
            //是否出现环
            if(fast==slow){
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while(index1!=index2){
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index1;
            }
        }
        return NULL;
    }
};
  • 时间复杂度: O(n),快慢指针相遇前,慢指针走的次数小于链表长度(没走1圈fast和slow就相遇了),快慢指针相遇后,两个index指针走的次数也小于链表长度,总体为走的次数小于 2n
  • 空间复杂度: O(1)

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

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

相关文章

Amos各版本安装指南

Amos下载链接 https://pan.baidu.com/s/1uyblN8Q-knNKkqQVlNnXTw?pwd0531 1.鼠标右击【Amos28】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Amos28】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Amos28】选择【以管理员身份运行…

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中&#xff0c;我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序&#xff0c;就是那个让您的鞋子焕然一新的魔法师。通过这个小程序&#xff0c;您可以在线预约、支付&#xff0c;查询洗鞋订单&#xff0c;并与洗鞋店铺进行互动&#xff0c;轻松享受专业的洗鞋服…

计算机毕业设计 基于SpringBoot的工作量统计系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

计算机毕业设计------经贸车协小程序

项目介绍 本项目分为三种用户类型&#xff0c;分别是租赁者&#xff0c;车主&#xff0c;管理员用户&#xff1b; 管理员用户包含以下功能&#xff1a; 管理员登录,个人中心,租赁者管理,车主管理,赛事活动管理,车类别管理,租车管理,租车订单管理,车辆出售管理,购买订单管理,…

数据结构第2章 栈和队列

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 0、思维导图栈和队列1、栈1&#xff09;特点2&#xff0…

计算机网络【Cookie和session机制】

会话&#xff08;Session&#xff09;跟踪是Web程序中常用的技术&#xff0c;用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份&#xff0c;Session通过在服务器端记录信息确定用户身份。 本章将系统地讲述Cookie与Sess…

Springboot集成RabbitMq二

接上一篇&#xff1a;Springboot集成RabbitMq一-CSDN博客 1、搭建项目-消费者 与之前一样 2、创建配置类 package com.wym.rabbitmqconsumer.utils;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.spring…

RabbitMQ集群的简单说明

1.普通集群(副本集群) 当集群中某一时刻master主节点宕机&#xff0c;可以对master中Queue中的消息进行备份。而就算master宕机了&#xff0c;从节点不会对外提供服务&#xff0c;等到master节点恢复后&#xff0c;系统才会恢复正常。 主从架构的缺点是队列中的消息只是位于主节…

流量预测资源总结(不断更新)

目录 整理流量预测数据集&#xff08;1&#xff09;Telecom Italia 意大利电信 2015&#xff08;2&#xff09;City Cellular Traffic Map (C2TM) 2015&#xff08;3&#xff09;、LTE Network Traffic Data_kaggle&#xff08;4&#xff09;、Cellular Traffic Analysis Data …

ROS学习笔记(8)进一步深入了解ROS第二步

0.前提 在上一讲中我提到过该系列是基于宾夕法尼亚大学工程学院的ROS公开课&#xff0c;系列文章将来源于公开课中的课后习题。该系列可以很好的帮助大家更加深入的了解ROS的一些概念。&#xff08;有效面对HR的提问。&#xff09; 1. (C)What is a nodehandle object? Can we…

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash&#xff0c;将会有更多的 Solana 生态的铭…

OpenCV中实现图像旋转的方法

OpenCV中实现图像旋转的方法 函数&#xff1a;cv2.flip() 功能&#xff1a;水平或者垂直翻转 格式&#xff1a;dst cv2.flip(src,flipCode[,dst]) 参数说明&#xff1a; src&#xff1a;输入图像 dst&#xff1a;和原图像具有相同大小、类型的目标图像。 flipCode&#…

Docker中的核心概念

1.镜像 Image 一个镜像就代表一个软件。mysql镜像、redis镜像、mq镜像 2.容器 Container 一个镜像运行一次就会生成一个容器&#xff0c;容器就是一个运行的软件服务。 3.远程仓库 Repository 远程仓库用来存储所有软件的镜像&#xff0c;Docker Hub 4.本地仓库 用来存储…

对偶问题的基本性质

写于&#xff1a;2024年1月3日晚 修改于&#xff1a; 原规划与对偶规划 原规划对偶规划 max ⁡ z C T X s.t. { A X ≤ b , 其中 X ( m ∗ 1 ) X ≥ 0 \begin{aligned} & \max \mathrm{z}\mathbf{C}^T \mathbf{X} \\ & \text { s.t. }\left\{\begin{array}{l}\mat…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序&#xff0c;可以为学员提供更便捷的学习体验&#xff0c;同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云&#xff0c;登录到后台&#xff0c;选择教育系统并点击进入。在…

【复盘】2023年终总结

大家好&#xff0c;我是qxlx 2023年马上就要结束了&#xff0c;在此周末空闲时间进行整体复盘一下2023年关于自己的生活、工作、学习进度&#xff0c;以此进行记录。 01 工作 粗略算起来&#xff0c;来北京已经3年之久&#xff0c;那时候还是一个懵懵懂懂的学生&#xff0c;…

计算机毕业设计——基于SSM+Layui的图书管理系统(附源码)

1&#xff0c;项目背景 国家大力推进信息化建设的大背景下&#xff0c;城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区&#xff0c;商业和服务业也比较发达&#xff0c;公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…

【HarmonyOS开发】通过媒体查询,实现一次开发,多端部署

媒体查询&#xff08;Media Queries&#xff09;是一种在CSS中使用的技术&#xff0c;用于根据设备的特性和属性&#xff08;如屏幕宽度、设备类型等&#xff09;来应用不同的样式规则。通过媒体查询&#xff0c;可以根据不同的设备或屏幕尺寸为用户提供优化的布局和样式。 1、…

C#编程-使用构造函数和析构函数

使用构造函数和析构函数 如果想要在以创建对象时就初始化成员变量,可以创建名为构造函数的特殊函数。您可能还需要使用对象后从内存中删除这些对象。这可通过称为析构函数的函数实现。 实现构造函数 构造函数是在创建对象时自动调用的特殊方法。无须显式地调用构造函数。请…

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么&#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…