leetcode Sort List (Sort a linked list in O(n log n) time using constant space complexity)

Sort a linked list in O(n log n) time using constant space complexity.


题目就是链表的排序。迅速回顾下排序时间在这个级别上的,发现只有归并是合适的。也就是写个链表上的归并排序吧。

对于链表上的归并,其实就是把链表断开然后重新连接上,每次从n/2处断开,分别排序后再链接起来。思路很简单,可能处理链表的时候复杂点。我就简单按照这个思路写了下一次ac。代码不难理解就直接贴代码吧。

ListNode *sortList(ListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
    if(!head)
        return NULL;
    int k=0;
    ListNode *p=head;
    while(p)
    {
        k++;
        p=p->next;
    }
    if(k==1)
        return head;
    int l=k/2;    //计算结点个数,将链表分开。
    p=head;
    ListNode *q=head,*t=NULL;
    for(int i=0;i<l && q ;i++)
    {
        if(i==l-1)
            t=q;
        q=q->next;
    }
    if(t)
        t->next=NULL;//将链表分开。
    p=sortList(p);//分别对两段排序
    q=sortList(q);
    ListNode *hd=NULL,*pp=NULL;
    while(p&&q)//合并
    {
        if(p->val<=q->val)
        {
            if(!hd)            
               pp=hd=p;           
            else
            {
                pp->next=p;
                pp=p;
            }
            p=p->next;
        }
        else
        {
            if(!hd)           
                hd=pp=q;           
            else
            {
                pp->next=q;
                pp=q;
            }
            q=q->next;
        }
    }
    if(p)
        pp->next=p;
    if(q)
        pp->next=q;
    return hd;
}

如果有不正确的地方,请指正谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值