86. 分隔链表
1. 题目
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
1 | 输入:head = [1,4,3,2,5,2], x = 3 |
示例 2:
1 | 输入:head = [2,1], x = 2 |
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
2. 思路
已知题目需要将整串链表按照给定的
x
值划分为两个区间,小于x
值的节点按照相对顺序摆放在左区间,而大于或等于x
值的节点按照相对顺序摆放在右区间根据上述要求,可以得知题目需要保持相对顺序,因此引入队列,利用队列的先进先出来保证链表节点的相对顺序
初始化
biggerQueue
队列用于存储大于或等于x
值的节点,初始化smallerQueue
队列用于存储小于x
值的节点初始化
node
节点为head
值用于后续遍历链表,初始化dummy
节点用于固定住头节点指针,因为作为结果返回的头节点可能会变化(最终将返回dummy.next
作为结果链表)遍历
node
链表- 当节点的值小于
x
时,则存放入smallerQueue
队列中 - 当节点的值大于或等于
x
时,则存放入biggerQueue
队列中
- 当节点的值小于
完成遍历后,重新初始化节点
node
值为dummy
,同时按照顺序遍历smallerQueue
队列中的节点,接续在node
节点值后当遍历接续完
smallerQueue
队列中的值后,再按照顺序遍历biggerQueue
队列中的节点最终返回
dummy.next
节点作为链表起始头节点
3. 代码
1 | /** |
4. 复杂度
- 时间复杂度:
O(1)
- 空间复杂度:
O(n)