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

news2024/11/26 15:31:56

文章目录

  • 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.coloradmin.cn/o/1492972.html

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

相关文章

微信小程序接入百度地图(微信小程序插件)使用文档

第一步配置域名 :在微信公众平台登录后配置服务域名称:https://apis.map.qq.com 第二步申请密钥 申请开发者密钥申请地址 第三步使用插件 选择添加插件 搜索腾讯位置服务地图选点 选择要授权的小程序 授权完毕会在这里显示插件信息 第四步查看使用文档 跳转至文…

[BUUCTF]-PWN:starctf_2019_babyshell解析(汇编\x00开头绕过+shellcode)

查看保护 查看ida 这里就是要输入shellcode&#xff0c;但是函数会有检测。 在shellcode前面构造一个以\x00机器码开头的汇编指令&#xff0c;这样就可以绕过函数检查了。 完整exp&#xff1a; from pwn import* context(log_leveldebug,archamd64) pprocess(./babyshell)she…

开源项目:图像分类算法在保险行业的创新应用与实践

一、引言 在当今数字化时代&#xff0c;保险行业正经历着前所未有的变革。传统保险公司面临着新兴科技的挑战&#xff0c;被迫重新思考其业务模式和营销策略。在这种背景下&#xff0c;我有幸参与了一个项目&#xff0c;该项目旨在通过整合多种销售渠道和技术手段&#xff0c;提…

电脑自动锁屏怎么设置?让你安心使用电脑

随着时代的进步&#xff0c;电脑已经成为我们日常生活中不可或缺的一部分。在使用电脑的过程中&#xff0c;为了保护隐私、节省能源或确保系统安全&#xff0c;许多用户都希望能够设置电脑自动锁屏。本文将详细介绍电脑自动锁屏怎么设置的三种方法&#xff0c;帮助用户轻松实现…

设计MySQL数据表的几个注意点

最近合作搞项目&#xff0c;发现了很多问题。特别的&#xff0c;数据库层面上的问题更为致命。记录一下&#xff0c;希望后面看到博客的同学们注意。 注意&#xff1a;以下观点只用于一般情况下的单体、微服务&#xff0c;不保证适用所有场景。 一、ID问题 ID名称问题 如下图…

Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明 独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现 相关界面包含关系 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #incl…

EdgeX Foundry - 导出数据到 HTTP 服务

文章目录 一、概述1.安装说明2.HTTP 服务 二、安装部署1.docker-comepse2.修改配置3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.测试 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/device/export-ht…

【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)

@[TOC](【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)) 具体步骤 第一步是注册您的应用程序。特别是,您需要将浏览器指向 http://apps.twitter.com,登录 Twitter(如果您尚未登录)并注册新应用程序。您现在可以为您的应用程序选择名称和描述(例如“Mining Demo”…

C++对象模型剖析(六)一一Data语义学(三)

Data 语义学&#xff08;三&#xff09; “继承” 与 Data member 上期的这个继承的模块我们还剩下一个虚拟继承&#xff08;virtual inheritance&#xff09;没有讲&#xff0c;现在我们就来看看吧。 虚拟继承&#xff08;Virtual Inheritance&#xff09; 虚拟继承本质就是…

Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录 一.Ajax技术 二. Axios 三.前后台分离开发介绍 四. YAPI 五.前端工程化 六.vue工程的目录结构 七.Vue项目核心文件 八.Vue组件库ElementUI AboutView.vue最终代码 AboutView.vue最终代码 九.Vue路由 十.案例 十一.nginx介绍 一.Ajax技术 1.Ajax概述 Ajax: 全…

【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

&#x1f33c;一、前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xf…

TRIZ理论破解重量与强度难题:材料科学的革命性突破!

在机械结构设计的领域里&#xff0c;工程师们常常面临着一个难以抉择的问题&#xff1a;如何在保证结构强度的同时&#xff0c;尽可能地减轻重量&#xff1f;传统的惯性思维可能会让我们倾向于增加材料的厚度来增强结构的稳固性&#xff0c;但这样一来&#xff0c;结构的重量也…

电网数字孪生的开发流程

电网的数字孪生是指利用数字化技术和模拟仿真技术&#xff0c;建立起一个与真实电网系统相对应的虚拟仿真系统。它可以帮助电网管理者进行实时监测、预测、优化和管理电网系统&#xff0c;提高电网的运行效率、安全性和可靠性。以下是电网数字孪生的典型开发流程&#xff0c;希…

Unity角色动画变成半跪\半蹲\下沉 的问题

导入的人物动画发生如图形态 解决方法&#xff1a;找到动画模型&#xff0c;Rig - AnimationType 改为Humanoid &#xff0c;然后Apply一下

【电路笔记】-双极晶体管

双极晶体管 文章目录 双极晶体管1、概述2、双极晶体管结构3、双极晶体管配置3.1 共基极 (CB) 配置3.2 共发射极 (CE) 配置3.3 共集极 (CC) 配置4、总结1、概述 双极结型晶体管是一种可用于开关或放大的半导体器件。 与半导体二极管不同,半导体二极管由两片半导体材料组成,形…

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义&#xff0c;这里摘抄下来…

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …

9.9 指针数组、指针的指针、main函数参数、小结

9.9 指针数组、指针的指针、main函数参数、小结 一.指针数组概念回顾二.指向指针的指针三.指针数组做main函数形参四.小结1.指针数据类型小结表&#xff1a;2.指针运算小结2.1 指针变量的加减2.2 指针变量的赋值2.3 指针变量可以为空值&#xff0c;表示不指向任何变量 3.void *…

OSI 的七层模型

OSI七层模型 一般指开放系统 互连参考模型 (Open System Interconnect 简称OSI) 是国际标准化组 织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系 统提供了一种功能结构的框架。 应用层&#xff1a;各种应用程序协议&#xff0c;比…