对链表进行排序:
参考的思路是来自于这位“哥们 ”https://leetcode.com/discuss/92326/share-my-c-concise-solutions-easy-to-understand
</pre><pre name="code" class="cpp">/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *sortList(ListNode *head) {
if(head == NULL){
return head;
}
ListNode *rt = Sort(head);
return rt;
}
ListNode * Sort(ListNode *begin ){
//找到链表中间的位置
if(begin == NULL){
return NULL;
}
//链表只有一个元素,直接返回
if(begin->next == NULL){
return begin;
}
ListNode *fast_ptr = begin->next ;//注意这里快指针要先走一步
ListNode *slow_ptr = begin ;
//两个快慢指针,将量表拆分成为两个部分
while(fast_ptr->next != NULL){
fast_ptr = fast_ptr->next->next;
slow_ptr = slow_ptr->next;
if(fast_ptr == NULL){// 注意这里也一定要判断,不然会段错误
break;
}
}
fast_ptr = slow_ptr->next;
slow_ptr->next = NULL;
ListNode *l1 = Sort(begin );
ListNode *l2 = Sort(fast_ptr);
//将两个排序的链表合并成为一个链表
ListNode dump(0);
ListNode * l = &dump;
while(l1 != NULL && l2 != NULL){
if(l1->val < l2->val ){
l->next = l1 ;
l = l->next;
l1 = l1->next;
}
else {
l->next = l2;
l = l->next;
l2 = l2->next;
}
}
if(l1 != NULL){
l->next = l1;
}
if(l2 != NULL){
l->next = l2;
}
return dump.next;//注意这里返回的是新的链表
}
void Print(ListNode * l){
while(l != NULL){
cout<<l->val <<" ";
l = l->next;
}
cout<<endl;
}
};