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