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

相关文章

使用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

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c