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

相关文章

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++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO