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

相关文章

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

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

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

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