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.解法一:
直接插入法:/** * 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 || !head->next) return head; ListNode* dummy = new ListNode(-1); dummy->next = head; ListNode* pre = dummy; ListNode* cur; while(pre->next && pre->next->val < x){ pre = pre->next; } ListNode* head2 = pre; pre = head2->next; while(pre&&pre->next){ cur = pre->next; if(cur->val < x){ pre->next = cur->next; //先删除需要插入的节点 cur->next = head2->next; head2->next =cur; head2= head2->next; } else pre = pre->next; } return dummy->next; }};
解法二:
把原链表拆分成两部分,再合起来即可ListNode *partition(ListNode *head, int x) { ListNode node1(0), node2(0); ListNode *p1 = &node1, *p2 = &node2; while (head) { if (head->val < x) p1 = p1->next = head; else p2 = p2->next = head; head = head->next; } p2->next = NULL; p1->next = node2.next; return node1.next;}