在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void show(struct ListNode* head)
{
struct ListNode* tmp=head;
while(tmp)
{
printf(" %d ",tmp->val);
tmp=tmp->next;
}
printf("\n");
}
struct ListNode* sortList(struct ListNode* head){
if(!head||!head->next)return head;
struct ListNode* mid=head;
struct ListNode *left=mid;
struct ListNode *right=mid;
struct ListNode * tmp=head;
tmp=tmp->next;
mid->next=NULL;
while(tmp)
{
struct ListNode *now=tmp;
tmp=tmp->next;
now->next=NULL;
if(now->val<mid->val)
{
now->next=left;
left=now;
}
else
{
right->next=now;
right=now;
}
}
right=mid->next;
mid->next=NULL;
//show(left);
//show(right);
left=sortList(left);
mid->next=sortList(right);
return left;
}
执行用时 :816 ms, 在所有 C 提交中击败了27.91% 的用户
内存消耗 :10.3 MB, 在所有 C 提交中击败了45.00%的用户