Sort List
Sort a linked list in O(n log n) time using constant space complexity.
对链表进行排序,要求时间复杂度为 O(nlogn),空间复杂度为 O(1)。
分析:
归并排序。
struct ListNode* mergeSort(struct ListNode* head);
struct ListNode* merge(struct ListNode* head, struct ListNode* right);
struct ListNode* sortList(struct ListNode* head) {
if(!head || head->next == NULL) /*空或者只有一个节点*/
{
return head;
}
return mergeSort(head);
}
/****归并排序****/
struct ListNode* mergeSort(struct ListNode* head)
{
struct ListNode *pre = head, *right = head;
struct ListNode *p = head;
if(!head || NULL == head->next)//只有一个节点,直接返回
{
return head;
}
while(p->next) /*二分链表*/
{
pre = right;
right = right->next;
if(p->next->next)
{
p = p->next->next;
}
else
{
break;
}
}
pre->next = NULL;/*链表断开成两部分分别进行归并排序*/
head = mergeSort(head); /*递归划分左半部分*/
right = mergeSort(right); /*递归划分右半部分*/
return merge(head, right);//合并
}
/********合并********/
struct ListNode* merge(struct ListNode* head, struct ListNode* right)
{
struct ListNode *phead = head, *pright = right;
struct ListNode *newHead = NULL, *pre = NULL;
while(phead || pright)
{
if(phead && !pright)/*pright排序完,phead未完*/
{
pre->next = phead;
pre = pre->next;
phead = phead->next;
continue;
}
if(pright && !phead)/*phead排完,pright未完*/
{
pre->next = pright;
pre = pre->next;
pright = pright->next;
continue;
}
if(phead->val < pright->val)/*head较小,放入排好链表*/
{
if(NULL == pre)
{
pre = phead;
newHead = pre;
}
else
{
pre->next = phead;
pre = pre->next;/*排好指针后移*/
}
phead = phead->next;/*指向下一节点*/
}
else if(phead->val > pright->val)/*right较小,放入排好链表*/
{
if(NULL == pre)
{
pre = pright;
newHead = pre;
}
else
{
pre->next = pright;
pre = pre->next; /*排好指针后移*/
}
pright = pright->next;/*指向下一节点*/
}
else /*相等,两个都放入排链表*/
{
if(NULL == pre)
{
pre = phead;
newHead = pre;
}
else
{
pre->next = phead;
pre = pre->next; /*排好指针后移*/
}
phead = phead->next;/*phead指向下一节点*/
pre->next = pright;
pre = pre->next;
pright = pright->next;/*pright指向下一个节点*/
}
}
return newHead;
}