题目描述(Medium)
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.
Note: 1 ≤ m ≤ n ≤ length of list.
题目链接
https://leetcode.com/problems/partition-list/description/
Example 1:
Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5
算法分析
方法一:头插法;
方法二:设置两个头结点,构建两个链表。
提交代码(方法一):
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* dummpy = new ListNode(-1);
dummpy->next = head;
ListNode* curr = dummpy->next;
ListNode* prev = dummpy;
ListNode* head2 = dummpy;
while (curr)
{
if (curr->val < x)
{
prev->next = curr->next;
curr->next = head2->next;
head2->next = curr;
head2 = head2->next;
}
prev = curr;
curr = curr->next;
}
return dummpy->next;
}
};
提交代码(方法二):
ListNode* partition(ListNode* head, int x) {
ListNode* left_dummpy = new ListNode(-1);
ListNode* right_dummpy = new ListNode(-1);
ListNode* left_curr = left_dummpy;
ListNode* right_curr = right_dummpy;
ListNode* curr = head;
while (curr)
{
if (curr->val < x)
{
left_curr->next = curr;
left_curr = curr;
}
else
{
right_curr->next = curr;
right_curr = curr;
}
curr = curr->next;
}
left_curr->next = right_dummpy->next;
right_curr->next = nullptr;
return left_dummpy->next;
}
测试代码:
// ====================测试代码====================
void Test(const char* testName, ListNode* head, int x, ListNode* expected)
{
if (testName != nullptr)
printf("%s begins: \n", testName);
Solution s;
ListNode* result = s.partition(head, x);
while (result && expected)
{
if (result->val != expected->val)
{
printf("failed\n");
return;
}
result = result->next;
expected = expected->next;
}
if(result || expected)
printf("failed\n");
else
printf("passed\n");
}
int main(int argc, char* argv[])
{
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(4);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(2);
ListNode* node5 = new ListNode(5);
ListNode* node6 = new ListNode(2);
ConnectListNodes(node1, node2);
ConnectListNodes(node2, node3);
ConnectListNodes(node3, node4);
ConnectListNodes(node4, node5);
ConnectListNodes(node5, node6);
ListNode* node7 = new ListNode(1);
ListNode* node8 = new ListNode(2);
ListNode* node9 = new ListNode(2);
ListNode* node10 = new ListNode(4);
ListNode* node11 = new ListNode(3);
ListNode* node12 = new ListNode(5);
ConnectListNodes(node7, node8);
ConnectListNodes(node8, node9);
ConnectListNodes(node9, node10);
ConnectListNodes(node10, node11);
ConnectListNodes(node11, node12);
Test("Test1", node1, 3, node7);
return 0;
}