#include <iostream>
#include <cstdlib>
struct node {
int num;
node* next;
};
struct slist {
node* head;
node* tail;
slist(void):head(NULL), tail(NULL){}
};
bool slist_add(slist* lst, int num);
void slist_clear(slist* lst);
//сортировка односвязного списка слиянием
void slist_sort(node*& head, node*& tail) {
if((head == NULL) || (head->next == NULL))
return;
node* ptr, *next, *end, *pos;
node* iter = head;
node* last = head;
ptr = next = end = NULL;
pos = head;
while((pos != NULL) && (pos->next != NULL)){
last = iter;
iter = iter->next;
pos = pos->next->next;
}
last->next = NULL;
slist_sort(head, tail);
slist_sort(iter, tail);
while((head != NULL) || (iter != NULL)) {
if(iter == NULL) {
next = head;
head = head->next;
} else if(head == NULL) {
next = iter;
iter = iter->next;
} else if(head->num < iter->num) {
next = head;
head = head->next;
} else {
next = iter;
iter = iter->next;
}
if(ptr == NULL)
ptr = next;
else
end->next = next;
end = next;
}
head = ptr;
tail = end;
}
//слияние списков
void slist_union(slist* l3, slist* l1, slist* l2){
node* p1 = l1->head;
node* p2 = l2->head;
node** r3 = &l3->head;
while((p1 != NULL) && (p2 != NULL)){
if(p1->num < p2->num){
*r3 = p1;
p1 = p1->next;
} else {
if(p1->num == p2->num){
*r3 = p1;
p1 = p1->next;
r3 = &(*r3)->next;
}
*r3 = p2;
p2 = p2->next;
}
r3 = &(*r3)->next;
}
if(p1 != NULL){
*r3 = p1;
l3->tail = l1->tail;
} else {
*r3 = p2;
l3->tail = l2->tail;
}
l1->head = l1->tail =
l2->head = l2->tail = NULL;
}
int main(void){
slist l1;
for(int i = 0; i < 10; ++i)
slist_add(&l1, std::rand() % 10);
slist l2;
for(int j = 0; j < 20; ++j)
slist_add(&l2, std::rand() % 20);
//сортируем списки
slist_sort(l1.head, l1.tail);
slist_sort(l2.head, l2.tail);
slist l3;
slist_union(&l3, &l1, &l2);
const node* p = l3.head;
while(p != NULL){
std::cout << p->num << ' ';
p = p->next;
}
slist_clear(&l3);
return 0;
}
//вставка в конец списка
bool slist_add(slist* lst, int num){
node* ptr = new (std::nothrow) node();
if(ptr != NULL){
ptr->num = num;
ptr->next = NULL;
if(lst->head == NULL)
lst->head = lst->tail = ptr;
else {
lst->tail->next = ptr;
lst->tail = ptr;
}
}
return (ptr != NULL);
}
//удаление списка
void slist_clear(slist* lst){
node* tmp;
while(lst->head != NULL){
tmp = lst->head;
lst->head = lst->head->next;
delete tmp;
}
lst->tail = NULL;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnN0cnVjdCBub2RlIHsKCWludCAgIG51bTsKCW5vZGUqIG5leHQ7Cn07CgpzdHJ1Y3Qgc2xpc3QgewoJbm9kZSogaGVhZDsKCW5vZGUqIHRhaWw7CglzbGlzdCh2b2lkKTpoZWFkKE5VTEwpLCB0YWlsKE5VTEwpe30KfTsKCmJvb2wgc2xpc3RfYWRkKHNsaXN0KiBsc3QsIGludCBudW0pOwp2b2lkIHNsaXN0X2NsZWFyKHNsaXN0KiBsc3QpOwoKCi8v0YHQvtGA0YLQuNGA0L7QstC60LAg0L7QtNC90L7RgdCy0Y/Qt9C90L7Qs9C+INGB0L/QuNGB0LrQsCDRgdC70LjRj9C90LjQtdC8CnZvaWQgc2xpc3Rfc29ydChub2RlKiYgaGVhZCwgbm9kZSomIHRhaWwpIHsKCWlmKChoZWFkID09IE5VTEwpIHx8IChoZWFkLT5uZXh0ID09IE5VTEwpKQoJCXJldHVybjsKCglub2RlKiBwdHIsICpuZXh0LCAqZW5kLCAqcG9zOwoJbm9kZSogaXRlciA9IGhlYWQ7Cglub2RlKiBsYXN0ID0gaGVhZDsKCglwdHIgPSBuZXh0ID0gZW5kID0gTlVMTDsKCXBvcyA9IGhlYWQ7Cgl3aGlsZSgocG9zICE9IE5VTEwpICYmIChwb3MtPm5leHQgIT0gTlVMTCkpewoJCWxhc3QgPSBpdGVyOwoJCWl0ZXIgPSBpdGVyLT5uZXh0OwoJCXBvcyAgPSBwb3MtPm5leHQtPm5leHQ7Cgl9CglsYXN0LT5uZXh0ID0gTlVMTDsKCQoJc2xpc3Rfc29ydChoZWFkLCB0YWlsKTsKCXNsaXN0X3NvcnQoaXRlciwgdGFpbCk7CgoJd2hpbGUoKGhlYWQgIT0gTlVMTCkgfHwgKGl0ZXIgIT0gTlVMTCkpIHsKCQlpZihpdGVyID09IE5VTEwpIHsKCQkJbmV4dCA9IGhlYWQ7CgkJCWhlYWQgPSBoZWFkLT5uZXh0OwoJCX0gZWxzZSBpZihoZWFkID09IE5VTEwpIHsKCQkJbmV4dCA9IGl0ZXI7CgkJCWl0ZXIgPSBpdGVyLT5uZXh0OwoJCX0gZWxzZSBpZihoZWFkLT5udW0gPCBpdGVyLT5udW0pIHsKCQkJbmV4dCA9IGhlYWQ7CgkJCWhlYWQgPSBoZWFkLT5uZXh0OwoJCX0gZWxzZSB7CgkJCW5leHQgPSBpdGVyOwoJCQlpdGVyID0gaXRlci0+bmV4dDsKCQl9CgoJCWlmKHB0ciA9PSBOVUxMKSAKCQkJcHRyID0gbmV4dDsKCQllbHNlCgkJCWVuZC0+bmV4dCA9IG5leHQ7CgkJZW5kID0gbmV4dDsKCX0KCWhlYWQgPSBwdHI7Cgl0YWlsID0gZW5kOwp9CgoKLy/RgdC70LjRj9C90LjQtSDRgdC/0LjRgdC60L7Qsgp2b2lkIHNsaXN0X3VuaW9uKHNsaXN0KiBsMywgc2xpc3QqIGwxLCBzbGlzdCogbDIpewoJbm9kZSogIHAxID0gbDEtPmhlYWQ7Cglub2RlKiAgcDIgPSBsMi0+aGVhZDsgCglub2RlKiogcjMgPSAmbDMtPmhlYWQ7CgoJd2hpbGUoKHAxICE9IE5VTEwpICYmIChwMiAhPSBOVUxMKSl7CgkJaWYocDEtPm51bSA8IHAyLT5udW0pewoJCQkqcjMgPSBwMTsKCQkJcDEgID0gcDEtPm5leHQ7CgkJfSBlbHNlIHsKCQkJaWYocDEtPm51bSA9PSBwMi0+bnVtKXsKCQkJCSpyMyA9IHAxOwoJCQkJcDEgID0gcDEtPm5leHQ7CgkJCQlyMyAgPSAmKCpyMyktPm5leHQ7CgkJCX0KCQkJKnIzID0gcDI7CgkJCXAyICA9IHAyLT5uZXh0OwoJCX0KCQlyMyA9ICYoKnIzKS0+bmV4dDsKCX0KCglpZihwMSAhPSBOVUxMKXsKCQkqcjMgICAgICA9IHAxOwoJCWwzLT50YWlsID0gbDEtPnRhaWw7IAoJfSBlbHNlIHsKCQkqcjMgICAgICA9IHAyOwoJCWwzLT50YWlsID0gbDItPnRhaWw7Cgl9CglsMS0+aGVhZCA9IGwxLT50YWlsID0KCWwyLT5oZWFkID0gbDItPnRhaWwgPSBOVUxMOwp9CgoKaW50IG1haW4odm9pZCl7CglzbGlzdCBsMTsKCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQoJCXNsaXN0X2FkZCgmbDEsIHN0ZDo6cmFuZCgpICUgMTApOwoKCXNsaXN0IGwyOwoJZm9yKGludCBqID0gMDsgaiA8IDIwOyArK2opCgkJc2xpc3RfYWRkKCZsMiwgc3RkOjpyYW5kKCkgJSAyMCk7CQkKCgkvL9GB0L7RgNGC0LjRgNGD0LXQvCDRgdC/0LjRgdC60LgKCXNsaXN0X3NvcnQobDEuaGVhZCwgbDEudGFpbCk7CglzbGlzdF9zb3J0KGwyLmhlYWQsIGwyLnRhaWwpOwoKCXNsaXN0IGwzOwoJc2xpc3RfdW5pb24oJmwzLCAmbDEsICZsMik7CgoJY29uc3Qgbm9kZSogcCA9IGwzLmhlYWQ7Cgl3aGlsZShwICE9IE5VTEwpewoJCXN0ZDo6Y291dCA8PCBwLT5udW0gPDwgJyAnOwoJCXAgPSBwLT5uZXh0OwoJfQoJc2xpc3RfY2xlYXIoJmwzKTsKCXJldHVybiAwOwp9CgovL9Cy0YHRgtCw0LLQutCwINCyINC60L7QvdC10YYg0YHQv9C40YHQutCwCmJvb2wgc2xpc3RfYWRkKHNsaXN0KiBsc3QsIGludCBudW0pewoJbm9kZSogcHRyID0gbmV3IChzdGQ6Om5vdGhyb3cpIG5vZGUoKTsKCWlmKHB0ciAhPSBOVUxMKXsKCQlwdHItPm51bSAgPSBudW07CgkJcHRyLT5uZXh0ID0gTlVMTDsKCQlpZihsc3QtPmhlYWQgPT0gTlVMTCkKCQkJbHN0LT5oZWFkID0gbHN0LT50YWlsID0gcHRyOwoJCWVsc2UgewoJCQlsc3QtPnRhaWwtPm5leHQgPSBwdHI7CgkJCWxzdC0+dGFpbCA9IHB0cjsKCQl9Cgl9CglyZXR1cm4gKHB0ciAhPSBOVUxMKTsKfQoKLy/Rg9C00LDQu9C10L3QuNC1INGB0L/QuNGB0LrQsAp2b2lkIHNsaXN0X2NsZWFyKHNsaXN0KiBsc3QpewoJbm9kZSogdG1wOwoJd2hpbGUobHN0LT5oZWFkICE9IE5VTEwpewoJCXRtcCAgICAgICA9IGxzdC0+aGVhZDsKCQlsc3QtPmhlYWQgPSBsc3QtPmhlYWQtPm5leHQ7CgkJZGVsZXRlIHRtcDsKCX0KCWxzdC0+dGFpbCA9IE5VTEw7Cn0=