题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
分析
输入:链表头节点 head
输出:变换后的链表头节点
解题思路
题目要求我们重新对链表排序,根据是节点值是否小于 x,然后还要返回这个新的链表。
那我们肯定要把链表分成左右两部分,然后再把他们链接 🔗 到一起,再返回头节点就行了。
那我们开始操作:
我们举个例子 🌰,x = 3,
我们创建两个 dummyHead,分别为 small, large,表示小于和大于等于 x 的节点组成的链表。
这里选用 dummyHead 的原因是要方便处理为空的情况,我们链接 🔗 两个链表的时候,只要通过 .next 的方式就可以了。不用考虑是否变量为空。
这里面需要注意的一点就是,我们 large 的部分的最后一个节点,如果取的是链表中间的某个节点,那么他的 next 实际上是指向另一个节点的,这是不正确的,所以要把它指向 null
我们来看代码。
代码
var partition = function (head, x) {
let small = new ListNode(0);
const smallHead = small;
let large = new ListNode(0);
const largeHead = large;
while (head !== null) {
if (head.val < x) {
small.next = head;
small = small.next;
} else {
large.next = head;
large = large.next;
}
head = head.next;
}
large.next = null;
small.next = largeHead.next;
return smallHead.next;
};
复杂度
时间:O(N), 遍历了一遍链表
空间:O(N), 需要存储几个指针