LeetCode_24_中等_两两交换链表中的节点

文章目录

  • 1. 题目
  • 2. 思路及代码实现(Python)
    • 2.1 递归
    • 2.2 迭代


1. 题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

在这里插入图片描述

输入: h e a d = [ 1 , 2 , 3 , 4 ] head = [1,2,3,4] head=[1,2,3,4]
输出: [ 2 , 1 , 4 , 3 ] [2,1,4,3] [2,1,4,3]

示例 2:

输入: h e a d = [ ] head = [] head=[]
输出: [ ] [] []

示例 3:

输入: h e a d = [ 1 ] head = [1] head=[1]
输出: [ 1 ] [1] [1]


提示

  • 链表中节点的数目在范围 [ 0 , 100 ] [0, 100] [0,100]
  • 0 < = N o d e . v a l < = 100 0 <= Node.val <= 100 0<=Node.val<=100

2. 思路及代码实现(Python)

2.1 递归

可以通过递归的方式实现两两交换链表中的节点。递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

h e a d head head 表示原始链表的头节点,新的链表的第二个节点,用 n e w H e a d newHead newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 n e w H e a d . n e x t newHead.next newHead.next。令 h e a d . n e x t = s w a p P a i r s ( n e w H e a d . n e x t ) head.next = swapPairs(newHead.next) head.next=swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 h e a d head head 的下一个节点。然后令 n e w H e a d . n e x t = h e a d newHead.next = head newHead.next=head,即完成了所有节点的交换。最后返回新的链表的头节点 n e w H e a d newHead newHead

该算法的时间复杂度取决于链表的节点数 n n n,为 O ( n ) O(n) O(n),空间复杂度取决于递归的栈深为 O ( n ) O(n) O(n)

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        newHead = head.next
        head.next = self.swapPairs(newHead.next)
        newHead.next = head
        return newHead

执行用时:27 ms
消耗内存:16.45 MB

2.2 迭代

也可以通过迭代的方式实现两两交换链表中的节点。

创建哨兵结点 d u m m y H e a d dummyHead dummyHead,令 d u m m y H e a d . n e x t = h e a d dummyHead.next = head dummyHead.next=head。令 t e m p temp temp 表示当前到达的节点,初始时 t e m p = d u m m y H e a d temp = dummyHead temp=dummyHead。每次需要交换 t e m p temp temp 后面的两个节点。

如果 t e m p temp temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 t e m p temp temp 后面的两个节点 n o d e 1 node1 node1 n o d e 2 node2 node2,通过更新节点的指针关系实现两两交换节点。

具体而言,交换之前的节点关系是 t e m p − > n o d e 1 − > n o d e 2 temp -> node1 -> node2 temp>node1>node2,交换之后的节点关系要变成 t e m p − > n o d e 2 − > n o d e 1 temp -> node2 -> node1 temp>node2>node1,因此需要进行如下操作。

t e m p . n e x t = n o d e 2 temp.next = node2 temp.next=node2
n o d e 1. n e x t = n o d e 2. n e x t node1.next = node2.next node1.next=node2.next
n o d e 2. n e x t = n o d e 1 node2.next = node1 node2.next=node1

完成上述操作之后,节点关系即变成 t e m p − > n o d e 2 − > n o d e 1 temp -> node2 -> node1 temp>node2>node1。再令 t e m p = n o d e 1 temp = node1 temp=node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

两两交换链表中的节点之后,新的链表的头节点是 d u m m y H e a d . n e x t dummyHead.next dummyHead.next,返回新的链表的头节点即可。该算法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度只需存储固定数量的变量,因此为 O ( 1 ) O(1) O(1)

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        dummyHead = ListNode(0)
        dummyHead.next = head
        temp = dummyHead
        while temp.next and temp.next.next:
            node1 = temp.next
            node2 = temp.next.next
            temp.next = node2
            node1.next = node2.next
            node2.next = node1
            temp = node1
        return dummyHead.next

执行用时:29 ms
消耗内存:16.42 MB

题解来源:力扣官方题解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows11编译FFmpeg源码完整步骤

1.安装MSYS2 下载并安装MSYS2 安装GCC GCC安装成功 克隆FFmpeg源码 打开MSYS2终端并进入ffmpeg文件夹,然后输入./configure回车开始生成makefile

JavaEE——简单认识JS(Web API)

文章目录 一、认识什么是 WebAPI二、认识事件三、操作元素1. innerHTML 属性2. 获取 / 修改元素内容3. 获取 / 修改 元素属性4. 获取 / 修改 表单元素属性5. 获取 / 修改 样式属性6. 创建 / 删除元素 一、认识什么是 WebAPI 1.什么是API 在我们了解 WebAPI 之前&#xff0c;我们…

苍穹外卖学习-----2024/03/09

1.菜品分页查询 代码在这里 分页查询菜品 2.删除菜品 [链接]param 1、概览 本文将带你了解 Spring 中 RequestParam 注解的用法。 简单地说&#xff0c;可以使用 RequestParam 从请求中提取查询参数、表单参数甚至是多个参数。 2、示例端点 假设我们有一个端点 /api/foos&a…

二叉树遍历(前中后序的递归/非递归遍历、层序遍历)

二叉树的遍历 1. 二叉树的前序、中序、后序遍历 前、中、后序遍历又叫深度优先遍历 注&#xff1a;严格来说&#xff0c;深度优先遍历是先访问当前节点再继续递归访问&#xff0c;因此&#xff0c;只有前序遍历是严格意义上的深度优先遍历 首先需要知道下面几点&#xff1a; …

Spring学习 基础(三)MVC

5、Spring MVC 传统Web模式&#xff1a; Model:系统涉及的数据&#xff0c;也就是 dao 和 bean。View&#xff1a;展示模型中的数据&#xff0c;只是用来展示。Controller&#xff1a;处理用户请求都发送给 &#xff0c;返回数据给 JSP 并展示给用户。 随着 Spring 轻量级开发…

Vue项目实战-空间论坛(2)

项目实战 实现userlist页面 获取userlist列表&#xff0c;可使用ajax,axios 实现 这里采用ajax实现&#xff0c;需要添加Jquery依赖&#xff0c;然后在UserListView.vue中引入 在UserListView.vue组件的入口函数中定义users变量&#xff0c;并引入ref 使用ajax从云端动…

目标检测——监控下打架检测数据集

一、简述 首先&#xff0c;监控下打架检测是维护公共安全的重要手段。在公共场所、学校、监狱等地方&#xff0c;打架事件往往难以避免。通过安装打架检测监控系统&#xff0c;可以实时监控并准确识别打架事件&#xff0c;及时采取必要的应对措施&#xff0c;有效地减少打架事…

手写分布式配置中心(五)整合springboot(不自动刷新的)

springboot中使用配置方式有四种&#xff0c;分别是environment、BeanDefinition、Value、ConfigurationProperties。具体的原理可以看我之前的一篇文章https://blog.csdn.net/cjc000/article/details/132800290。代码在https://gitee.com/summer-cat001/config-center 原理 …

PTA L2-004 这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树&#xff1a;对于任一结点&#xff0c; 其左子树中所有结点的键值小于该结点的键值&#xff1b;其右子树中所有结点的键值大于等于该结点的键值&#xff1b;其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”&#xf…

减少PDF文件大小的方法,亲测巨好用!!!

周六晚上&#xff0c;导师突然发了两个pdf&#xff0c;让把大小改成1M以下&#xff01;&#xff01;&#xff01; 试了很多方法最后&#xff0c;发现了个最好使用的&#xff0c;不过需要下载下Adobe Acrobat文件编辑软件&#xff0c;下载地址如下 链接&#xff1a;https://pan.…

基于Java的开放实验室管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

LVS+Keepalived 高可用集群

一、Keepalived工具介绍 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 基于vrrp协议完成地址流动 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义) 为ipvs集群的各RS做健康状态检测 基于脚本调用接口完成脚本中定义的功能&#xff0c;进而…

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

力扣题目链接 struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {//定义虚拟头节点dummy 并初始化使其指向headstruct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0;dummy->next head;//定义 fast slow 双指针struct ListNode* f…

springboot整合shiro的实战教程(一)

文章目录 1.权限的管理1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权 2.什么是shiro3.shiro的核心架构3.1 Subject3.2 SecurityManager3.3 Authenticator3.4 Authorizer3.5 Realm3.6 SessionManager3.7 SessionDAO3.8 CacheManager3.9 Cryptography 4. shiro中的认证4.1…

Cocos Creator 2d光照

godot游戏引擎是有2d光照的&#xff0c;用起来感觉还是很强大的&#xff0c;不知道他是怎么搞的&#xff0c;有时间看看他们怎么实现的。 之前一直以为cocos社区里面没有2d光照的实现&#xff0c;偶然看到2d实现的具体逻辑&#xff0c;现在整理如下&#xff0c; 一&#xff1…

CAS 登出方案

1.配置 CAS 服务器端 添加配置cas.logout.followServiceRedirects:true&#xff0c;使支持 CAS 退出时支持输入 service 参数为跳转路径 2.配置客户端服务,添加session清除操作 3.前端文件添加跳转重定向 1) 直接在客户端调用http请求/cas/logout去注销不能携带cookie信息, 无…

Jmeter 性能 —— 模拟百万高并发压测思路!

测试场景&#xff1a;模拟百万级的订单量一个物流信息的查询接口。 条件&#xff1a;接口响应时间<150ms以内。10万并发量每秒。 设计性能测试方案&#xff1a; 1、生产环境 10W/S --并发量&#xff08;架构师/技术负责人提供&#xff09;20台机器&#xff08;4G*4核配置…

【探索C++容器:set和map的使用】

[本节目标] 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为…

第三百八十九回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

qsort函数的用法及参数的讲解

第一种用法展示&#xff1a;&#xff08;整形数组的qsort&#xff09; 一&#xff0c;qsort函数的定义&#xff1a; qsort 函数的定义&#xff1a;void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 使用其需要包含头文件&#x…
最新文章