给你一个链表的头节点 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
分析:
方法:双链表
本题不需要保留每个分区中各节点的初始相对位置,因此我们可以直接将大于等于 x 的节点接到 x 后面,小于 x 的节点接到 x 前面,这样也满足条件。可以用两个链表分别存储,注意不要产生环链表。
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
//记录大于等于x的节点和小于x的节点
ListNode greater = new ListNode(0), less = new ListNode(0);
ListNode a = greater, b = less;
//遍历
while(head != null){
//大于等于x
if(head.val >= x){
a.next = head;
a = a.next;
}
//小于x
else{
b.next = head;
b = b.next;
}
head = head.next;
}
//置空a的下个节点,防止出现环
a.next = null;
//连接两个节点
b.next = greater.next;
return less.next;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list-lcci