当前位置: 首页 > news >正文

LeetCode[中等] 24.两两交换链表中的结点

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

 思路:递归

头结点head,第二个结点head.next, 交换结点之后,原第二个结点变成新链表的头结点,令newHead = head.next。递归思路为:

  1. 对 newHead.next 调用递归,将除了前两个结点以外的部分完成交换;
  2. head.next 指向递归调用之后的头结点;
  3. newHead.next 指向head。
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int val=0, ListNode next=null) {*         this.val = val;*         this.next = next;*     }* }*/
public class Solution {public ListNode SwapPairs(ListNode head) {if(head == null || head.next == null)return head;ListNode newHead = head.next;head.next = SwapPairs(newHead.next);newHead.next = head;return newHead;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个结点进行更新指针的操作,每个结点的更新指针操作的时间都是 O(1)。

  • 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用栈的深度,递归调用栈最多不会超过 n 层。

思路:迭代

需要在头结点head之前新建一个哑结点dummyHead,为了交换 node1​ 和 node2​,需要依次进行以下操作:

  1. 将 temp.next 指向 node2​;

  2. 将 node1​.next 指向 node2​.next;

  3. 将 node2​.next 指向 node1​。

public class Solution {public ListNode SwapPairs(ListNode head) {ListNode dummyHead = new ListNode(0, head);ListNode temp = dummyHead;while (temp.next != null && temp.next.next != null) {ListNode node1 = temp.next;ListNode node2 = temp.next.next;temp.next = node2;node1.next = node2.next;node2.next = node1;temp = node1;}return dummyHead.next;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表中的每个结点一次,每个结点的反转操作的时间都是 O(1)。

  • 空间复杂度:O(1)。


http://www.mrgr.cn/news/37439.html

相关文章:

  • CBC 模式安全问题
  • 【MATLAB代码】二维环境下的RSSI定位程序,自适应锚点数量,带图像输出、坐标输出、中文注释
  • 思想和认知,从身边的事情和从小经历就在培养。谁在起跑线!
  • 在 Windows8.1 下编译 Chromium (103.0.5060.68 之三)
  • 图文检索(3):On the Integration of Self-Attention and Convolution
  • 为什么电销要用外呼系统
  • Netty 与 WebSocket之间的关系
  • GAMIT使用wuhm产品解算北斗数据报错处理
  • Drivers on multiprocessor and multithreaded ASIC platforms (1)
  • 云打包p12苹果证书和profile文件在线制作流程
  • 【艾思科蓝】网络安全的隐秘战场:构筑数字世界的铜墙铁壁
  • Cisco Secure Firewall Management Center Virtual 7.6.0 发布下载,新增功能概览
  • 【前端样式】Sweetalert2简单用法
  • 用Python实现运筹学——Day 4: 线性规划的几何表示
  • Python中使用pip换源的详细指南
  • 物联网智能家居行业主流方案_zigbee无线通信技术详解
  • distribution shifts 和图回归任务
  • 企业代码补全增强使用实践
  • 什么是正交矩阵
  • 【JAVA开源】基于Vue和SpringBoot的网上租赁系统