考虑归并排序:
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; }