LeetCode之单链表排序
题目描述:
给定一个乱序的单链表的头节点,对该链表中的节点进行排序
要求时间复杂度为O(nlgn),空间复杂度为O(1)
分析:
由于题目要求时间复杂度我O(nlgn),因此选择排序和插入排序可以排除。
在排序算法中,时间复杂度为O(nlgn)的主要有:归并排序、快速排序、堆排序。
代码如下:
class Solution {public: ListNode* partion(ListNode* pbegin,ListNode* pend){ if(pbegin==pend||pbegin->next==pend) return pbegin; int key=pbegin->val; ListNode* p=pbegin; ListNode* q=pbegin; while(q!=pend){ if(q->val<key){ p=p->next; swap(p->val,q->val); } q=q->next; } swap(p->val,pbegin->val); return p; } void quick_sort(ListNode* pbegin,ListNode* pend){ if(pbegin==pend||pbegin->next==pend) return; ListNode* mid=partion(pbegin,pend); quick_sort(pbegin,mid); quick_sort(mid->next,pend); } ListNode *sortList(ListNode *head) { if(head==NULL||head->next==NULL) return head; quick_sort(head,NULL); return head; }};
浙公网安备 33010602011771号