Problem:
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值的序列,然后组合起来。要求是不能改变每个数之间的相对位置。
题目挺简单的,就是开两个链表,一个保存小于的,另一个保存大于等于的,然后拼起来就好。这样的话,时间复杂度是O(n),空间复杂度为O(n)。代码如下:
Code:(LeetCode运行6ms)
/**
* 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 *less_than_x = new ListNode(-1);
ListNode *otherNodes = new ListNode(-1);
ListNode *left = less_than_x;
ListNode *right = otherNodes;
for (auto i = head; i != NULL; i = i -> next) {
if (i -> val < x) {
left -> next = new ListNode(i -> val);
left = left -> next;
} else {
right -> next = new ListNode(i -> val);
right = right -> next;
}
}
left -> next = otherNodes -> next;
return less_than_x -> next;
}
};