您的位置:首页 > 编程语言 > C语言/C++

链表排序

2015-08-31 09:40 453 查看
        可以用对数组进行排序的方法对链表进行排序,但由于链表有单向访问的特点所以用归并排序比较合理。

ListNode *Merge(ListNode *pre1, ListNode *pre2){
ListNode *fir = pre1 -> next;
ListNode *sec = pre2 -> next;
ListNode *result = new ListNode(-1);
ListNode *p = result;

while(fir != nullptr && sec != nullptr){
if(fir -> val < sec -> val){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}else{
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
}

if(fir == nullptr){
while(sec != nullptr){
p -> next = sec;
p = p -> next;
sec = sec -> next;
}
p -> next = nullptr;
}
if(sec == nullptr){
while(fir != nullptr){
p -> next = fir;
p = p -> next;
fir = fir -> next;
}
p -> next = nullptr;
}
return result;
}

ListNode *MergeSort(ListNode *head, ListNode *tail){
if(head == tail){
ListNode *result = new ListNode(-1);
result -> next = head;
head -> next = nullptr;
return result;
}
ListNode *mid = head;
ListNode *fast = head;

while(fast != tail && fast -> next != tail){
mid = mid -> next;
fast = fast -> next -> next;
}
ListNode *tmp = mid -> next;
ListNode *result1 = MergeSort(head, mid);
ListNode *result2 = MergeSort(tmp, tail);
return Merge(result1, result2);
}

ListNode *sortList(ListNode *head){
if(head == nullptr || head -> next == nullptr)
return head;

ListNode *tail = head;
while(tail -> next != nullptr)
tail = tail -> next;

ListNode *result = MergeSort(head, tail);
return result -> next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 代码 链表 排序