题目:

题解:
- struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {
- struct ListNode* dummyHead = malloc(sizeof(struct ListNode));
- dummyHead->val = 0;
- struct ListNode *temp = dummyHead, *temp1 = head1, *temp2 = head2;
- while (temp1 != NULL && temp2 != NULL) {
- if (temp1->val <= temp2->val) {
- temp->next = temp1;
- temp1 = temp1->next;
- } else {
- temp->next = temp2;
- temp2 = temp2->next;
- }
- temp = temp->next;
- }
- if (temp1 != NULL) {
- temp->next = temp1;
- } else if (temp2 != NULL) {
- temp->next = temp2;
- }
- return dummyHead->next;
- }
-
- struct ListNode* sortList(struct ListNode* head) {
- if (head == NULL) {
- return head;
- }
- int length = 0;
- struct ListNode* node = head;
- while (node != NULL) {
- length++;
- node = node->next;
- }
- struct ListNode* dummyHead = malloc(sizeof(struct ListNode));
- dummyHead->next = head;
- for (int subLength = 1; subLength < length; subLength <<= 1) {
- struct ListNode *prev = dummyHead, *curr = dummyHead->next;
- while (curr != NULL) {
- struct ListNode* head1 = curr;
- for (int i = 1; i < subLength && curr->next != NULL; i++) {
- curr = curr->next;
- }
- struct ListNode* head2 = curr->next;
- curr->next = NULL;
- curr = head2;
- for (int i = 1; i < subLength && curr != NULL && curr->next != NULL;
- i++) {
- curr = curr->next;
- }
- struct ListNode* next = NULL;
- if (curr != NULL) {
- next = curr->next;
- curr->next = NULL;
- }
- struct ListNode* merged = merge(head1, head2);
- prev->next = merged;
- while (prev->next != NULL) {
- prev = prev->next;
- }
- curr = next;
- }
- }
- return dummyHead->next;
- }