考虑归并排序:
1 找出链表的中间节点,用快慢指针。
2 递归对左右子链表排序
3 合并俩个子链表
ListNode *sortList(ListNode *head) {
if(head==NULL || head->next==NULL){
return head;
}
ListNode* middle=findMiddle(head);
ListNode* right=sortList(middle->next);
middle->next=NULL;
ListNode* left=sortList(head);
return mergeList(left,right);
}
ListNode* findMiddle(ListNode* root){
//用快慢指针
ListNode* fast=root->next;
ListNode* slow=root;
while(slow!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
ListNode* mergeList(ListNode* root1,ListNode* root2){
if(root1==NULL)
return root2;
if(root2==NULL)
return root1;
ListNode* pHead=new ListNode(0);
ListNode* p=pHead;
while(root1!=NULL&&root2!=NULL){
if(root1->val<root2->val){
p->next=root1;
root1=root1->next;
}else{
p->next=root2;
root2=root2->next;
}
p=p->next;
}
if(root1 != NULL)
p->next=root1;
if(root2 != NULL)
p->next=root2;
ListNode* head=pHead->next;
delete pHead;
pHead=NULL;
return head;
}