c_cpp 链接列表的合并排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 链接列表的合并排序相关的知识,希望对你有一定的参考价值。
// https://www.geeksforgeeks.org/merge-sort-for-linked-list/
#include <iostream>
#include <list>
using namespace std;
struct linked_list {
int data;
struct linked_list *next;
};
typedef struct linked_list node;
void print (node *n) {
while (n) {
cout<< n->data<< "->";
n = n->next;
}
cout<< "NULL";
return;
}
void insert(node **headref, int n) {
node* last = *headref;
node *temp=new node;
temp->data = n;
temp->next=NULL;
if (last == NULL) {
*headref = temp;
return;
}
while (last->next)
last = last->next;
last->next = temp;
return;
}
void split(node *head, node **aref, node **bref) {
node *fast=head->next, *slow=head;
while(fast) {
fast = fast->next;
if (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
}
*aref = head;
*bref = slow->next;
slow->next = NULL;
return;
}
node* merge(node *a, node *b) {
node *head = NULL;
while (a && b) {
if (a->data <= b->data) {
insert(&head, a->data);
a = a->next;
}
else {
insert(&head, b->data);
b = b->next;
}
}
while (a) {
insert(&head, a->data);
a = a->next;
}
while (b) {
insert(&head, b->data);
b = b->next;
}
return head;
}
void MergeSort(node** headref) {
node *head = *headref;
node *a, *b;
if (head == NULL || head->next == NULL)
return;
split(head,&a,&b);
MergeSort(&a);
MergeSort(&b);
*headref=merge(a,b);
return;
}
int main() {
int n;
node *head=NULL;
while (true) {
cout<< "Enter the number: ";
cin>>n;
if (n==-9)
break;
else
insert(&head,n);
}
print(head);
MergeSort(&head);
cout<< "\nSorted List is:\n";
print(head);
}
以上是关于c_cpp 链接列表的合并排序的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 合并两个已排序的链接列表
c_cpp 21.合并两个排序列表
c_cpp 合并两个排序列表,递归和迭代
c_cpp 21.合并两个排序列表 - 难度容易 - 2018.8.10
c_cpp 两个排序链接列表的交集
c_cpp 通过更改链接对0,1和2的链接列表进行排序