您的位置:首页 > 其它

lintcode刷题系列:链表排序----归并排序 递归

2017-07-19 15:51 274 查看
归并排序的时间O(nlgn)

1>找到链表的中间值;

2>合并两个有序的链表;

ListNode* Sort(ListNode *head) {

    if(head==NULL || head->next==NULL) {

        return head;

    }

    return mergesort(head);

}

ListNode* mergesort(ListNode *head) {

    if(head==NULL || head->next==NULL) {

        return head;

    }

    ListNode *pHead, *qHead, *pre;

    pHead = qHead = head;

    pre = NULL;

    while(qHead!=NULL || qHead->next!=NULL) {

        qHead = qHead->next->next;

        pre = pHead;

  pHead = pHead->next;

    }

    pre->next = NULL; //分裂成两个独立的链表

    ListNode *l, *r;

    l = mergesort(head);

    r = mergesort(pHead);

    return merge(l, r); //合并

}

ListNode* merge(ListNode* l, ListNode *r) {

    ListNode *res = (ListNode*)malloc(sizeof(ListNode));

    ListNode *temp = res;

    while(l!=NULL && r!=NULL) {

if(l->val < r->val) {

    temp->next = l;

    temp = temp->next;

    l = l->next;

} else {

    temp->next = r;

    temp = temp->next;

    r = r->next;

}

    }

    if(l!=NULL) {

temp->next = ;

    } else if (r!=NULL) {

temp->next = r;

    }

    temp = res->next;

    free(res);

    return temp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: