题目
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
示例
思路
链表排序思路和数组排序思路差不多
数组判断结尾用下标,链表可以用head->next == NULL判断结尾
冒泡排序:定义双指针,在定义临时变量保存交换值,一个指针遍历链表,另外一个指针循环遍历链表判断与前一个指针数值大小,将链表中最小是数交换到前一个链表位置,但是时间复杂度需要O(n^2),非常耗时间,所以超时了
转换思路可以定义一个辅助数组,保存整个链表的值
然后对数组进行快排
再将排序后数组的值赋值个链表
代码
冒泡排序:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
*sortList:将链表升序排列
struct ListNode* head:链表头结点
返回值:返回升序链表
*/
struct ListNode* sortList(struct ListNode* head){
struct ListNode * i = head;
struct ListNode * j;
int t;
while(i)
{
j = i->next;
while(j)
{
if(i->val > j->val)
{
t = i->val;
i->val = j->val;
j->val = t;
}
j = j->next;
}
i = i->next;
}
return head;
}
快排,额外数组
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int cmp(const void * a , const void * b)
{
return *(int *)a - *(int *)b;
}
/*
*sortList:将链表升序排列
struct ListNode* head:链表头结点
返回值:返回升序链表
*/
struct ListNode* sortList(struct ListNode* head){
if(!head)
{
return NULL;
}
int i = 0;
struct ListNode * l = head;
int ans[50001];
while(l)
{
ans[i++] = l->val;
l = l->next;
}
qsort(ans , i , sizeof(ans[0]) , cmp);
l = head;
for(int j = 0; j < i; j++)
{
l->val = ans[j];
l = l->next;
}
return head;
}
时间空间复杂度
冒泡排序:
快排,额外数组