题解 | #单链表的排序#C语言归并排序递归+辅助数组法

单链表的排序

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

归并排序递归

struct ListNode* mid(struct ListNode* head);//中点分割函数
struct ListNode* merge(struct ListNode* head1,struct ListNode* head2);//排序合并两个链表
struct ListNode* sortInList(struct ListNode* head){
    if(head == NULL || head->next == NULL)
        return head;
    //递归终止条件 最终只剩下一个节点的时候返回
    struct ListNode* head1 = head;
    struct ListNode* head2 = mid(head);
    //printf("%d %d\n",head1->val,head2->val);
    head1 = sortInList(head1);
    head2 = sortInList(head2);
 

    return merge(head1,head2);
}
 

struct ListNode* mid(struct ListNode* head)
{
  //快慢指针找中点,返回第二段链表的头节点
    struct ListNode* H=malloc(sizeof(struct ListNode));
    H->next=head;
    struct ListNode* slow = H;
    struct ListNode* fast = H;
 
    while(fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
 
    struct ListNode* temp = slow->next;
    slow->next = NULL;
 
    return temp;
}
 
struct ListNode* merge(struct ListNode* head1,struct ListNode* head2)
{
  //排序合并两个链表
    struct ListNode* H =(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur = H;
    while(head1 != NULL && head2 != NULL)
    {
        if(head1->val < head2->val)
        {
            cur->next = head1;
            head1 = head1->next;
        }
        else
        {
            cur->next = head2;
            head2 = head2->next;
        }
        cur = cur->next;
    }
    if(head1!=NULL)
        cur->next=head1;
    if(head2!=NULL)
        cur->next=head2;
    return H->next;
}
int cmp(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}
struct ListNode* sortInList(struct ListNode* head ) {
    // write code here
    int num[1000000];
    int i=0;
    while(head!=NULL)
    {
        num[i++]=head->val;//存入链表的val值
        head=head->next;
    }
    qsort(num, i, sizeof(int), cmp);//快排
    struct ListNode* H=malloc(sizeof(struct ListNode));
    struct ListNode* cur=H;
    int j=0;
  //创建新链表
    while(j!=i)
    {
        struct ListNode* temp=malloc(sizeof(struct ListNode));
        temp->next=NULL;
        temp->val=num[j++];
        cur->next=temp;
        cur=temp;
    }
    return H->next;
}
全部评论

相关推荐

头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1153452次浏览 17163人参与
# 通信和硬件还有转码的必要吗 #
11252次浏览 101人参与
# 不去互联网可以去金融科技 #
20934次浏览 259人参与
# 和牛牛一起刷题打卡 #
19150次浏览 1637人参与
# 实习与准备秋招该如何平衡 #
203572次浏览 3629人参与
# 大厂无回复,继续等待还是奔赴小厂 #
5041次浏览 33人参与
# OPPO开奖 #
19397次浏览 268人参与
# 通信硬件薪资爆料 #
266127次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2236次浏览 34人参与
# 互联网公司评价 #
97781次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25042次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
455031次浏览 5127人参与
# 国企和大厂硬件兄弟怎么选? #
53936次浏览 1013人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14650次浏览 349人参与
# 硬件人的简历怎么写 #
82299次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19423次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28667次浏览 249人参与
# 学历对求职的影响 #
161299次浏览 1804人参与
# 你收到了团子的OC了吗 #
538938次浏览 6390人参与
# 你已经投递多少份简历了 #
344374次浏览 4963人参与
# 实习生应该准时下班吗 #
97056次浏览 723人参与
# 听劝,我这个简历该怎么改? #
63532次浏览 622人参与
牛客网
牛客企业服务