86. Partition List
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.
分析
题目要求将小于某个特定数的节点放在左边,大于等于该特定数的节点放在右边,并且不变换顺序。那就遍历一遍链表,将小于该数的节点连接起来,将大于等于该数的节点连接起来,然后再将两个链表连接起来
源码
ListNode* partition(ListNode* head, int x) {
if(!head || head->next == NULL) return head;
ListNode *pNode = head;
ListNode *pHead_smaller = NULL;
ListNode *pHead_bigger = NULL;
ListNode *pCurrent_smaller = NULL;
ListNode *pCurrent_bigger = NULL;
while(pNode) {
if(pNode->val < x) {
if(!pHead_smaller) pHead_smaller = pNode;
else if(pCurrent_smaller) pCurrent_smaller->next = pNode;
pCurrent_smaller = pNode;
} else {
if(!pHead_bigger) pHead_bigger = pNode;
else if(pCurrent_bigger) pCurrent_bigger->next = pNode;
pCurrent_bigger = pNode;
}
pNode = pNode->next;
}
if(pCurrent_smaller) pCurrent_smaller->next = pHead_bigger;
if(pCurrent_bigger) pCurrent_bigger->next = NULL; // 最后元素的下一个元素置空很重要,否则提交时候输出超时
return pHead_smaller == NULL ? pHead_bigger : pHead_smaller;
}