學渣帶你刷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;
}

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