1. 题目
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
这个题读了好久,可总是感觉题意描述的模糊不清。
最后才发现,题中的意思就是就是让你把比x小的数放到x之前就行了。比x大的数字不用管,它爱呆哪呆哪!
热心网友评论:和之前力扣上的题根本不一样。这个题的要求其实更宽松一些。就是把小于x的节点放在前面,大于等于x的节点放在后面。至于x两边的链表是什么顺序,并没有要求。
解题思路:
前面的用尾插法,后面的用头插法,然后把两块接起来: //重排链表
class Solution
{
public:
ListNode* partition(ListNode* head, int x)
{
if(head == NULL || head->next == NULL)
return head;
ListNode * first = new ListNode(-1);
ListNode * result = first;
ListNode * second = new ListNode(-1);
ListNode * headNext = NULL;
while(head)
{
headNext = head->next;
if(head->val<x)
{
first->next = head;
first = first->next;
}
else
{
head->next = second->next;
second->next = head;
}
head = headNext;
}
first->next = second->next;
return result->next;
}
};