- 实例要求:
- 1、给定一个
链表的头结点 head
,请将其按升序排列并返回排序后的链表
; - 2、链表中
节点的数目的范围为 [0, 5 * 104]
; - 实例分析:
- 1、引入
qsort函数和自定义cmp函数
解决问题; - 2、借助自定义指针作为中间量,将链表节点的值依次赋值;
- 3、排序结束后,再将指针保存的链表节点归位即可;
- 4、为
防止内存泄漏
,需要使用free函数
释放指针所占用的空间; - qsort函数:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
/*
参数:
base //指向要排序的数组的第一个元素的指针
nitems //由 base 指向的数组中元素的个数
size //数组中每个元素的大小,以字节为单位
compar //用来比较两个元素的函数
*/
- 自定义cmp函数:
//对int数组升序排序
int cmp(const void *a ,const void *b)
{
return *(int *)a-*(int *)b;
}
-
相关案例:
-
示例代码:
/**
* 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;
}
struct ListNode* sortList(struct ListNode* head)
{
if(head == NULL || head->next == NULL)
{
return head;
}
struct ListNode *temp = head;
int len = 0;
while(temp != NULL)
{
++len;
temp = temp->next;
}
int *num = (int *)malloc(sizeof(int) * len);
int i = 0;
temp = head;
while(temp != NULL)
{
num[i++] = temp->val;
temp = temp->next;
}
qsort(num,len,4,cmp);
i = 0;
temp = head;
while(temp != NULL)
{
temp->val = num[i++];
temp = temp->next;
}
free(num);
num = NULL;
return head;
}
- 运行结果: