好像以前做过,归并排序的形式实现。
用快慢指针找到链表的中点,使用归并排序的方法对左边的链表和 右边的链表分别递归执行排序。
然后合并两个排序好的链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode * merge(ListNode *p1,ListNode *p2){
ListNode *head = NULL;
ListNode *cur = NULL;
while(p1 && p2){
if(p1->val<=p2->val){
if(!head){
head = p1;
cur = p1;
}else{
cur->next = p1;
cur = cur->next;
}
p1=p1->next;
}else{
if(!head){
head = p2;
cur = p2;
}else{
cur->next = p2;
cur = cur->next;
}
p2=p2->next;
}
}
if(p1){
if(!head){
head = p1;
}else{
cur->next = p1;
}
}
if(p2){
if(!head){
head = p2;
}else{
cur->next = p2;
}
}
return head;
}
ListNode* sortList(ListNode* head) {
if(!head || !head->next){
return head;
}
if(!head->next->next){
if(head->val<=head->next->val){
return head;
}else{
ListNode *p = head;
head = head->next;
p->next = NULL;
head->next = p;
return head;
}
}
ListNode* slow = head;
ListNode *fast = head;
while(fast!=NULL){
fast = fast->next;
if(fast && fast->next){
fast = fast->next;
}else{
break;
}
slow = slow->next;
}
ListNode *p1 = head;
ListNode *p2 = slow->next;
slow->next = NULL;
p1 = sortList(p1);
p2 = sortList(p2);
head = merge(p1,p2);
return head;
}
};