给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
一、思路
(一)暴力法
对链表进行遍历,得到两个链表,链表A中所有的值小于x,链表B中所有的值大于或等于x
C++代码:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (head == NULL || head->next == NULL)
return head;
bool less_first = false;
if (head->val < x)
less_first = true;
ListNode *p = head;
vector<int> less, great;
while (p != NULL) {
if (p->val < x)
less.push_back(p->val);
else
great.push_back(p->val);
p = p->next;
}
p = head;
for (int i = 0; i < less.size(); i++) {
p->val = less[i];
p = p->next;
}
for (int i = 0; i < great.size(); i++) {
p->val = great[i];
p = p->next;
}
return head;
}
};
执行效率:
(二)指针法
设置两个链表,一个存放小于x的节点,另一个存放大于等于x的节点
C++代码:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode less_head(0);
ListNode great_head(0);
ListNode *less = &less_head;
ListNode *great = &great_head;
while (head) {
if (head->val < x) {
less->next = head;
less = head;
}
else {
great->next = head;
great = head;
}
head = head->next;
}
less->next = great_head.next;
great->next = NULL;
return less_head.next;
}
};
执行效率: