给你一个链表的头节点 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
的节点,之后进行拼接即可。
时间复杂度 $O(n),空间复杂度
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
d1, d2 = ListNode(), ListNode()
t1, t2 = d1, d2
while head:
if head.val < x:
t1.next = head
t1 = t1.next
else:
t2.next = head
t2 = t2.next
head = head.next
t1.next = d2.next
t2.next = None
return d1.next
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode d1 = new ListNode();
ListNode d2 = new ListNode();
ListNode t1 = d1, t2 = d2;
while (head != null) {
if (head.val < x) {
t1.next = head;
t1 = t1.next;
} else {
t2.next = head;
t2 = t2.next;
}
head = head.next;
}
t1.next = d2.next;
t2.next = null;
return d1.next;
}
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* d1 = new ListNode();
ListNode* d2 = new ListNode();
ListNode* t1 = d1;
ListNode* t2 = d2;
while (head) {
if (head->val < x) {
t1->next = head;
t1 = t1->next;
} else {
t2->next = head;
t2 = t2->next;
}
head = head->next;
}
t1->next = d2->next;
t2->next = nullptr;
return d1->next;
}
};
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func partition(head *ListNode, x int) *ListNode {
d1, d2 := &ListNode{}, &ListNode{}
t1, t2 := d1, d2
for head != nil {
if head.Val < x {
t1.Next = head
t1 = t1.Next
} else {
t2.Next = head
t2 = t2.Next
}
head = head.Next
}
t1.Next = d2.Next
t2.Next = nil
return d1.Next
}
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function (head, x) {
const d1 = new ListNode();
const d2 = new ListNode();
let t1 = d1,
t2 = d2;
while (head) {
if (head.val < x) {
t1.next = head;
t1 = t1.next;
} else {
t2.next = head;
t2 = t2.next;
}
head = head.next;
}
t1.next = d2.next;
t2.next = null;
return d1.next;
};