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

题目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=dummyheadwhile(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=dummyheadwhile(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.hqwc.cn/news/318134.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sectigo企业的通配符证书续费

首先&#xff0c;我们要知道SSL证书是有期限的&#xff0c;通常SSL证书的有效期为一年&#xff0c;在SSL证书到期之前我们需要对其进行续费&#xff0c;从而延续SSL证书对网站的保护。Sectigo是中多的CA认证机构之一&#xff0c;申请速度快、性价比高&#xff0c;很多子域名站点…

密码学:带密钥的消息摘要算法一数字签名算法

文章目录 前言手写签名和数字签名前置知识点&#xff1a;消息摘要算法数字签名算法数字签名算法的由来数字签名算法在实际运用的过程附加&#xff1a;签名和摘要值的解释 数字签名算法的家谱数字签名算法的消息传递模型经典数字签名算法-RSA实现 数字签名标准算法-DSA实现 圆曲…

二叉树的层序遍历,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 方法分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 题目地址&#xff1a; 102. 二叉树的层序遍历 - 力扣&…

How to understand HCS in Huawei Cloud

How to understand HCS in Huawei Cloud 概述 概述 参考文献 华为云产品首页 / 华为云Stack深度用云展望2025白皮书矿山智能化暨矿山大模型最佳实践白皮书城市数据空间CDS白皮书政务数据之道白皮书政务数据安全建设指南从理念到实践 商业银行混沌工程研究和实践白皮书现代化金融…

【算法每日一练]-dfs bfs(保姆级教程 篇8 )#01迷宫 #血色先锋队 #求先序排列 #取数游戏 #数的划分

目录 今日知识点&#xff1a; 使用并查集映射点&#xff0c;构造迷宫的连通块 vis计时数组要同步当回合的处理 递归求先序排列 基于不相邻的取数问题&#xff1a;dfs回溯 n个相同球放入k个相同盒子&#xff1a;dfs的优化分支暴力 01迷宫 血色先锋队 求先序排列 取数游…

docker如何配置阿里云镜像加速?

登录阿里云后&#xff0c;我们点击右上角的控制台&#xff0c;控制台中搜索镜像加速服务&#xff0c;然后点击帮助文档的官方镜像加速&#xff1a; 点击容器镜像服务控制台&#xff1a; 在镜像工具里面的镜像加速器中就可以看到&#xff1a; 分别执行即可&#xff1a; 之后我们…

希尔排序算法——交换法

希尔排序&#xff0c;又称缩小增量排序&#xff0c;是插入排序的改进版。它是因DL&#xff0e;Shell于1959年提出而得名。希尔排序的实质就是分组插入排序&#xff0c;该方法是非稳定的排序算法。 具体来说&#xff0c;希尔排序通过将待排序序列分成多个子序列&#xff0c;分别…

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…

在 2024 年搜索中提升排名的 7 项内容调整

忘掉关键词填充和算法追逐。2024 年的重点是 EEAT&#xff0c;宝贝&#xff01;谷歌希望最专业、最权威、最值得信赖&#xff08;EEAT&#xff09;的内容能够排名靠前&#xff0c;这就意味着您的内容需要成为专业知识、参与度和信任度的交响乐。 准备好让搜索引擎和人类都无法…

力扣hot100 对称二叉树 递归 队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考思路 递归的难点在于&#xff1a;找到可以递归的点 为什么很多人觉得递归一看就会&#xff0c;一写就废。 或者说是自己写无法写出来&#xff0c;关键就是你对递归理解的深不深。 对于此题&#xf…

test ui-03-cypress 入门介绍

cypress 是什么&#xff1f; 简而言之&#xff0c;Cypress 是一款专为现代Web构建的下一代前端测试工具。我们解决了开发人员和质量保证工程师在测试现代应用程序时面临的关键问题。 我们使以下操作成为可能&#xff1a; 设置测试编写测试运行测试调试测试 Cypress经常与Se…

阿赵UE学习笔记——7、导入资源

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次将会把一个带动作和贴图的钢铁侠模型&#xff0c;导入的UE的项目中。 1、准备的资源 这里有2个fbx文件&#xff0c;都是带着网格和动画的&#xff0c;模型网格和骨骼是一样的&#xff0c;只…