方法:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
ListNode* minList = (ListNode*)malloc(sizeof(ListNode));
ListNode* maxList = (ListNode*)malloc(sizeof(ListNode));
ListNode* cur = pHead;
ListNode* minTail = minList, *maxTail = maxList;
while(cur != NULL)
{
if(cur->val < x)
{
minTail->next = cur;
cur = cur->next;
minTail = minTail->next;
minTail->next = NULL;
}
else
{
maxTail->next = cur;
cur = cur->next;
maxTail = maxTail->next;
maxTail->next = NULL;
}
}
minTail->next = maxList->next;
free(maxList);
ListNode* newhead = minList->next;
free(minList);
return newhead;
}
};
思路:
对已有链表按照一个给定值大小进行分割且不能破坏原有顺序,最好的解决方法就是分别创建两个新链表。遍历原有链表,把值小于x的节点插入到A链表,把值不小于x的节点插入到B链表。最后将B链表整体尾插到A链表上。
需要注意的是,采用哨兵位头节点链表可以避免出现空链表的情况。