Version: Next
86.分隔链表
难度 中等
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
Given the head of a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
示例 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
三指针
- 虚拟头节点
- 左侧(小于 x 的链表),右侧 (大于等于 x 的链表),两个指针
- 遍历链表,分别加入两个链表中
- 将左侧链表最后一个节点 next 指向 右侧链表第一个
- 最终右链表的最后一个节点 next 设置为 null,否则会形成循环链表
public static ListNode partition(ListNode head, int x) {
if (head == null) return null;
ListNode virtualLeftHead = new ListNode(Integer.MIN_VALUE, null);
ListNode virtualRightHead = new ListNode(Integer.MIN_VALUE, null);
ListNode leftLast = virtualLeftHead;
ListNode rightLast = virtualRightHead;
while (head != null) {
if (head.val < x) { // 左
leftLast.next = head;
leftLast = leftLast.next;
} else { // 右
rightLast.next = head;
rightLast = rightLast.next;
}
head = head.next;
}
leftLast.next = virtualRightHead.next;
rightLast.next = null;
return virtualLeftHead.next;
}