LeetCode题练习与总结:分隔链表--86

2024-05-05 21:12

本文主要是介绍LeetCode题练习与总结:分隔链表--86,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200]
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

二、解题思路

  1. 创建两个新的链表,一个用于存储小于x的节点(我们称之为小于链表),另一个用于存储大于或等于x的节点(我们称之为大于等于链表)。
  2. 遍历原始链表,根据节点的值将节点添加到小于链表或大于等于链表中。
  3. 将小于链表的尾部连接到大于等于链表的头部,得到新的链表。
  4. 返回新链表的头节点。

三、具体代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode partition(ListNode head, int x) {ListNode dummy1 = new ListNode(0); // 创建小于链表的哑节点ListNode dummy2 = new ListNode(0); // 创建大于等于链表的哑节点ListNode less = dummy1; // 小于链表的当前节点ListNode greaterOrEqual = dummy2; // 大于等于链表的当前节点while (head != null) {if (head.val < x) {less.next = head; // 将节点添加到小于链表中less = less.next; // 移动小于链表的当前节点} else {greaterOrEqual.next = head; // 将节点添加到大于等于链表中greaterOrEqual = greaterOrEqual.next; // 移动大于等于链表的当前节点}head = head.next; // 移动原始链表的当前节点}greaterOrEqual.next = null; // 设置大于等于链表的尾部为nullless.next = dummy2.next; // 将小于链表的尾部连接到大于等于链表的头部return dummy1.next; // 返回新链表的头节点}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历原始链表一次,对于每个节点,我们执行常数时间的操作(比较节点的值,然后将其添加到对应的链表中)。
  • 因此,时间复杂度是 O(n),其中 n 是链表中的节点数。
2. 空间复杂度
  • 我们创建了两个哑节点,分别用于小于链表和大于等于链表,这两个节点不存储有效的链表数据,所以它们不计入空间复杂度。
  • 我们没有创建任何新的节点,只是重新排列了现有的节点。
  • 因此,空间复杂度是 O(1),即常数空间复杂度。

综上所述,这段代码的时间复杂度是 O(n),空间复杂度是 O(1)。

五、总结知识点

1. 链表操作

  • 链表是线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的引用。
  • 代码中创建了两个哑节点,分别用于小于x的节点和大于等于x的节点,这样可以避免处理空链表的特殊情况。

2. 哑节点的使用

  • 哑节点是一种常用的技巧,用于简化链表操作,特别是在处理链表的头节点时。
  • 它作为一个不存储有效数据的节点,其next指针指向链表的真正头部,这样可以避免对头节点的特殊处理。

3. 链表的遍历

  • 使用while循环和当前节点的移动(head = head.next;)来遍历链表。
  • 在遍历过程中,根据节点的值将节点添加到小于链表或大于等于链表中。

4. 链表的分割

  • 通过调整节点的next指针,将原始链表分割成两个部分,一个包含小于x的节点,另一个包含大于等于x的节点。
  • 最后,将小于链表的尾部连接到大于等于链表的头部,形成一个新的链表。

5. 指针和引用

  • 在链表操作中,使用指针(在Java中是引用)来跟踪当前节点和链表的头部。
  • 通过更新这些指针,可以重新排列链表中的节点。

6. 链表与递归

  • 虽然这段代码没有使用递归,但链表问题通常也可以通过递归方法解决。
  • 递归可以简化链表的操作,尤其是在处理反向链表或复杂的链表操作时。

7. 边界条件的处理

  • 在链表操作中,需要特别注意边界条件,如空链表、单个节点的链表等。
  • 代码中通过检查head != null来确保在链表为空时不会发生错误。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:分隔链表--86的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962698

相关文章

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定