題目描述
在 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;
}