题目描述

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。需要保持节点的相对顺序。

解题思路

双指针法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var partition = function(head, x) {
// 创建两个虚拟头节点
let smallHead = new ListNode(0);
let bigHead = new ListNode(0);

// 用于移动的指针
let small = smallHead;
let big = bigHead;

// 遍历原链表
while(head) {
if(head.val < x) {
small.next = head;
small = small.next;
} else {
big.next = head;
big = big.next;
}
head = head.next;
}

// 连接两个链表
big.next = null;
small.next = bigHead.next;

return smallHead.next;
};

代码分析

  1. 创建两个虚拟头节点,分别存储小于x和大于等于x的节点
  2. 遍历原链表,根据节点值分配到对应链表
  3. 最后将两个链表连接起来
  4. 注意处理尾节点的next指针

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

注意事项

  1. 需要断开大值链表的尾部指针
  2. 保持节点的相对顺序不变
  3. 处理好链表为空的边界情况

参考资料