void fix_list(node *head){ node *first = head, *pre1=NULL,*pre2=NULL,*second=NULL; while (first) { if (first->next){ if (first->data < first->next->data){ pre1 = first; first = first->next; } else{ second = first; node *temp = second; while (second->next != NULL){ if (second->data>second->next->data){ pre2 = second; second = second->next; } else{ second = pre2; break; } } pre1->next = reverse(first, first, second->next, second->next); first = temp->next; } } else{ break; } } mergeSplit(head); print(head); }
void mergeSplit(node *head){ node *cur = head; while (cur->next){ if (cur->data < cur->next->data){ cur = cur->next; } else{ mergeSplit(cur->next); head=mergeSort(head,cur,cur->next); } } }
struct node *mergeSort(struct node *head) { if (NULL == head || NULL == head->next) { return head; } struct node *sechead = mergeSplit(head); head = mergeSort(head); sechead = mergeSort(sechead); return merge(head, sechead); }
void mergeSort(pathList **root) { pathList *head = *root; pathList *a; pathList *b; if ( (head == NULL) || (head->next == NULL) ) { return; } mergeSplit(head, &a, &b); mergeSort(&a); mergeSort(&b); (*root) = sortedMerge(a, b); }