https://leetcode.cn/problems/7WHec2/description/
//合并
struct ListNode* merge_link(struct ListNode* head1, struct ListNode* head2) {
struct ListNode* temhead = malloc(sizeof(struct ListNode));
temhead->val = 0;
struct ListNode *tmp = temhead, *cur1 = head1, *cur2 = head2;
while (cur1 && cur2) {
if (cur1->val <= cur2->val) {
tmp->next = cur1;
cur1 = cur1->next;
} else {
tmp->next = cur2;
cur2 = cur2->next;
}
tmp = tmp->next;
}
if (cur1) {
tmp->next = cur1;
}
if (cur2) {
tmp->next = cur2;
}
return temhead->next;
}
//分解
struct ListNode* merge_div(struct ListNode* head, struct ListNode* tail) {
//空结点,因为传参时,我们将NULL当作原链表的尾结点
if (head == NULL)
return head;
//单个结点
if (head->next == tail)
{
head->next = NULL;
return head;
}
//快慢指针找中点
struct ListNode *slow = head, *fast = head;
while (fast != tail) {
slow = slow->next;
fast = fast->next;
if (fast != tail) {
fast = fast->next;
}
}
// slow为中点
struct ListNode* mid = slow;
return merge_link(merge_div(head, mid), merge_div(mid, tail));
}
struct ListNode* sortList(struct ListNode* head) {
return merge_div(head, NULL);
}