题解 | #单链表的排序#

单链表的排序

http://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param head ListNode类 the head node
 * @return ListNode类
 */
#设置一个辅助数组拷贝出链表中的值,用归并排序来进行排序后又拷贝回链表中
#include<stdlib.h>
void merge(int *arr,int lo, int mid, int hi);
void mergeSort(int *arr,int lo, int hi)
{
    if(lo == hi) return;
    int mid = (lo +hi) >> 1;
    mergeSort(arr, lo, mid);
    mergeSort(arr, mid + 1, hi);
    merge(arr, lo ,mid, hi);
}
void merge(int *arr,int lo, int mid, int hi)
{
    int *B = (int*)malloc((mid -lo + 1)*sizeof(int));
    int i = 0, j = 0, k = 0;
    for(j = lo; j <= mid; j++)
    {
        *(B + (i ++)) = *(arr + j);
    }
    for(i = 0, k = lo, j = mid +1; i <= mid -lo;)
    {
        *(arr + (k++)) = *(B + i) < *(arr + j) || j > hi ? *(B + (i ++)) : *(arr + (j++));
    }
    free(B);
}
struct ListNode* sortInList(struct ListNode* head ) {
    // write code here
    int *arr = (int*)malloc(100000*sizeof(int));
    int i = 0, len = 0;
    struct ListNode *p = head;
    while(p)
    {
        *(arr + (i ++)) = p->val;
        p = p->next;
    }
    len = i;
    mergeSort(arr,  0, len - 1);
    p = head;
    i = 0;
    while(p)
    {
        p->val = *(arr + (i ++));
        p = p->next;
    }
    free(arr);
    return head;
}

全部评论
怎么运行超时呀
1 回复 分享
发布于 2023-07-11 22:06 福建

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务