/**************************************************************************
*
* 86. [Partition List](https://leetcode.com/problems/partition-list/)
*
* Given the head of 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.
*
* Example:
* Input: head = [1,4,3,2,5,2], x = 3
* Output: [1,2,2,4,3,5]
*
* 把链表拆分成2部分。
* 比x小的值移动到链表左侧,节点相对顺序不变。排序的稳定性,考虑到了归并排序 merge
**************************************************************************/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode NODE;
///
///
/// Approach 1: remove(delete and insert)
NODE *partition(NODE *head, int x){
if (NULL == head || NULL == head->next) return head;
NODE dum;
dum.next = head;
NODE *tail =&dum;
NODE *pre = &dum;
NODE *cur = head;
while (cur && cur->val < x) {
tail = cur;
pre = cur;
cur = cur->next;
}
while(cur) {
if (cur->val < x) {
//delete cur
pre->next = cur->next;
//insert cur
NODE *tmp = tail->next;
tail->next = cur;
cur->next = tmp;
tail = cur;//update tail of elements that less than x
cur = pre->next;
} else {
pre = cur;
cur = cur->next;
}
}
return dum.next;
}
///
///
/// Approach 2: Two Pointer Approach
NODE *partition(NODE *head, int x){
if (NULL == head || NULL == head->next) return head;
NODE dumL, dumR;
dumL.next = NULL;
dumR.next = NULL;
NODE *left = &dumL;
NODE *right= &dumR;
while (head) {
if (head->val < x) {
left->next = head;
left = left->next;
} else {
right->next = head;
right = right->next;
}
head = head->next;
}
left->next = dumR.next;
right->next = NULL;
return dumL.next;
}