Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
题意:给定一个单链表和一个x,把链表中小于x的放到前面,大于等于x的放到后面,每部分元素的原始相对位置不变。
思路:其实很简单,遍历一遍链表,把小于x的都挂到head1后,把大于等于x的都放到head2后,最后再把大于等于的链表挂到小于链表的后面就可以了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if(head == NULL)
return head;
ListNode *less = new ListNode(NULL), *sm = less;
ListNode *high = new ListNode(NULL), *bg = high;
ListNode *cur = head;
//主要是用尾插法 形成两个大小x的链表最后合成
while(cur) {
if(cur->val < x) {
sm->next = cur;
cur = cur->next;
sm = sm->next;
sm->next = NULL;
}else{
bg->next = cur;
bg = bg->next;
cur = cur->next;
bg->next = NULL;
}
}
sm->next = high->next;
return less->next;
}
};