题目描述
给定一个链表,再给定一个整数 pivot,请将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于 pivot 的节点, 右边部分都是大于 pivot 的节点。
除此之外,对调整后的节点顺序没有更多要求。
输入描述:
第一行两个整数 n 和 pivot,n 表示链表的长度。 第二行 n 个整数 ai 表示链表的节点。输出描述:
请在给定的函数内返回链表的头指针。示例1
输入
复制
5 3 9 0 4 5 1输出
复制
1 0 4 5 9备注:
1≤n≤1000000 −1000000≤ai,pivot≤1000000
两种解法,一种是利用数组,采用荷兰国旗题型的方法,一种是利用三个链表分别存放小于等于和大于的节点,最后对是三个链表进行归并。
方法一:利用数组
list_node * list_partition(list_node * head, int pivot)
{
//在下面完成代码
vector<list_node*> data;
for(list_node* cur = head; cur != nullptr; cur = cur->next) {
data.push_back(cur);
}
int lessIndex = 0, curIndex = 0, moreIndex = data.size() - 1;
while(curIndex <= moreIndex) {
if(data[curIndex]->val > pivot) {
swap(data[curIndex]->val, data[moreIndex]->val);
moreIndex --;
} else if(data[curIndex]->val < pivot) {
swap(data[curIndex]->val, data[lessIndex]->val);
lessIndex ++;
curIndex ++;
} else {
curIndex ++;
}
}
int i = 0;
for(i = 1; i < data.size(); i ++) {
data[i - 1]->next = data[i];
}
data[i - 1] == nullptr;
return data[0];
}
方法二:利用三个链表
list_node * list_partition(list_node * head, int pivot)
{
//在下面完成代码
list_node* lessHead = nullptr;
list_node* lessEnd = nullptr;
list_node* equalHead = nullptr;
list_node* equalEnd = nullptr;
list_node* moreHead = nullptr;
list_node* moreEnd = nullptr;
list_node* temp = nullptr;
while(head != nullptr) {
temp = head->next;
head->next = nullptr;
if(head->val < pivot) {
if(lessHead == nullptr) {
lessHead = head;
lessEnd = lessHead;
} else {
lessEnd->next = head;
lessEnd = lessEnd->next;
}
} else if(head->val > pivot) {
if(moreHead == nullptr) {
moreHead = head;
moreEnd = moreHead;
} else {
moreEnd->next = head;
moreEnd = moreEnd->next;
}
} else {
if(equalHead == nullptr) {
equalHead = head;
equalEnd = equalHead;
} else {
equalEnd->next = head;
equalEnd = equalEnd->next;
}
}
head = temp;
}
if(lessHead != nullptr) {
lessEnd->next = equalHead;
equalEnd = equalEnd == nullptr ? lessEnd : equalEnd;
}
if(equalEnd != nullptr) {
equalEnd->next = moreHead;
}
return lessHead != nullptr ? lessHead : equalHead != nullptr ? equalHead : moreHead;
}