学渣带你刷Leetcode148. 排序链表

题目描述

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:
 

算法:

 

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* cut(struct ListNode* head, int size){
    struct ListNode* p = head;
    while(p && --size){
        p = p->next;
    }
    if(!p) return NULL;

    struct ListNode* cur = p->next;
    p->next = NULL;
    return cur;
}
struct ListNode* merge(struct ListNode* l1, struct ListNode* l2){   

    struct ListNode *dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    dummyHead->val = 0;
    dummyHead->next = NULL;
    struct ListNode *p = dummyHead;
    while(l1 && l2){
        if(l1->val < l2->val){
            p->next = l1;           
            p = l1;
            l1 = l1->next;
        }
        else{
            p->next = l2;
            p = l2;
            l2 = l2->next;
        }
    }

    p->next = l1 ? l1 : l2;

    return dummyHead->next;
}

struct ListNode* sortList(struct ListNode* head){

    if(!head) return NULL;

    //获取链表长度
    int length = 0;
    struct ListNode *p = head;
    while(p){
        length++;
        p = p->next;
    }    
    struct ListNode *dummyHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    //哑节点
    dummyHead->val = 0;
    dummyHead->next = head;
    for(int size = 1; size < length; size *= 2){
        struct ListNode *cur = dummyHead->next;
        struct ListNode *tail = dummyHead;
        struct ListNode *left, *right;
        while(cur){
            left = cur;
            right = cut(left, size);
            cur = cut(right, size);

            tail->next = merge(left, right);
            while(tail->next){
                tail = tail->next;
            }
        }
    }

    return dummyHead->next;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章