148. 排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序
该题可以使用归并排序的算法,具体代码如下(C++版):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeLis(ListNode* left, ListNode* right)
{
ListNode* hair=new ListNode(-1);
ListNode* tmpNode=hair;
while(left && right)
{
if(left->val <= right->val)
{
tmpNode->next=left;
left=left->next;
}
else
{
tmpNode->next=right;
right=right->next;
}
tmpNode=tmpNode->next;
}
if (left) tmpNode->next=left;
if (right) tmpNode->next=right;
tmpNode=hair->next;
delete hair;
return tmpNode;
}
ListNode* sortList(ListNode* head) {
if(!head) return head;
int size=0;
ListNode* tmpNode=head;
while(tmpNode)
{
size++;
tmpNode=tmpNode->next;
}
if(size==1) return head;
int mid=size/2-1;
tmpNode=head;
while(mid)
{
tmpNode=tmpNode->next;
--mid;
}
ListNode* tmpNext=tmpNode->next;
tmpNode->next=nullptr;
ListNode* left=sortList(head);
ListNode* right=sortList(tmpNext);
return mergeLis(left,right);
}
};
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-list