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 的节点,然后在将这两个链表拼接起来,这样在一次遍历的情况就可以完成了。
代码如下:
/**
* 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) {
ListNode* bighead = new ListNode(0),*big,*smallhead = new ListNode(0),*small,*curr;
curr = head;
big = bighead;
small = smallhead;
while(curr != NULL)
{
if(curr->val >= x)
{
big->next = curr;
curr = curr->next;
big = big->next;
}
else
{
small->next = curr;
curr = curr->next;
small = small->next;
}
}
small->next = bighead->next;
big->next = NULL;
return smallhead->next;
}
};