使用归并排序的思想
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: //使用归并排序 void merge(ListNode* &head, ListNode* &mid, ListNode* &end){ if(head==mid && mid==end) return; ListNode* p=head, *p1=mid->next; vector<int> valList; int K=0; while(p!=mid->next && p1!=end->next){ if(p->val<=p1->val){ valList.push_back(p->val); K++; p=p->next; } else{ valList.push_back(p1->val); K++; p1=p1->next; } } while(p!=mid->next){ valList.push_back(p->val); K++; p=p->next; } while(p1!=end->next){ valList.push_back(p1->val); K++; p1=p1->next; } ListNode* p2=head; for(int k=0;k<K;++k){ p2->val=valList[k]; p2=p2->next; } } void mergeSort(ListNode* &head, ListNode* &end){ if(head==end) return; ListNode* pfast=head, *pslow=head; while(pfast!=end){ if(pfast->next!=end) pfast=pfast->next->next; else break; pslow=pslow->next; } ListNode* pmid=pslow;//利用快慢指针查找中间节点 if(head!=pmid) mergeSort(head, pmid); if(pmid!=end) mergeSort(pmid->next, end); merge(head, pmid, end); } ListNode* sortList(ListNode* head) { if(head==NULL || head->next==NULL) return head; ListNode* end=head; while(end->next!=NULL) end=end->next; mergeSort(head, end); return head; } };
文章来源: LeetCode 148. 排序链表