关注公众号程序猿从入门到入土查询更方便哦
建立两个非递减有序单向链表,然后合并成一个非递增链表
#include<iostream>
#define RESULT int
#define OK 1
#define ERROR 0
using namespace std;
typedef struct Node {
int data;
Node* next;
}LNode, * LinkList;
RESULT InitList(LinkList& L); //初始化链表
RESULT InsertData_Head(LinkList& L, int data); //头插
RESULT InsertData_Back(LinkList& L, int data); //尾插
RESULT InsertData_Middle(LinkList& L, int NO, int data); //在NO位置插入元素
RESULT Output_LinkList(LinkList& L); //打印链表
LinkList List_Combine(LinkList& L_1, LinkList& L_2); //合并链表,仅原空间
void ListSort(LinkList& L);
void reverse(LinkList& L) {
LinkList p;
int n = 1;
p = L->next;
while (p->next != NULL) {
p = p->next;
n++;
}
LinkList back, back1, p1;
p1 = L->next;
p = L;
for (int i = 0; i < n - 1; i++) {
while (p1->next != NULL) {
p1 = p1->next;
}
back = p1;
p1 = L;
while (p1->next->next != NULL) {
p1 = p1->next;
}
back1 = p1;
back->next = p->next;
back1->next = NULL;
p->next = back;
p = p->next;
}
}
int main() {
//初始化链表L_1
LinkList L_1;
if (!InitList(L_1)) {
return 0;
}
int n;
cin >> n;
while (n != 0) {
InsertData_Back(L_1, n);
cin >> n;
}
ListSort(L_1);
//初始化链表L_2
LinkList L_2;
if (!InitList(L_2)) {
return 0;
}
cin >> n;
while (n != 0) {
InsertData_Back(L_2, n);
cin >> n;
}
ListSort(L_2);
LinkList L_3 = new LNode;
L_3 = List_Combine(L_1, L_2);
reverse(L_3);
Output_LinkList(L_3);
//清除空间
delete(L_1);
delete(L_2);
return 0;
}
RESULT InitList(LinkList& L) {
L = new LNode;
L->next = NULL;
return OK;
}
RESULT InsertData_Head(LinkList& L, int data) {
LinkList temp = new LNode;
temp->data = data;
temp->next = L;
L = temp;
return OK;
}
RESULT InsertData_Back(LinkList& L, int data) {
LinkList temp = new LNode;
temp->data = data;
temp->next = NULL;
LinkList p = L;
while (p->next != NULL) {
p = p->next;
}
p->next = temp;
return OK;
}
RESULT InsertData_Middle(LinkList& L, int NO, int data) {
LinkList temp = new LNode;
temp->data = data;
LinkList p = L;
for (int i = 0; i < NO - 2; i++) {
p = p->next;
}
temp->next = p->next;
p->next = temp;
return OK;
}
RESULT Output_LinkList(LinkList& L) {
LinkList temp = L->next;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
return OK;
}
LinkList List_Combine(LinkList& L_1, LinkList& L_2) {
//链表指针
LinkList p_1 = L_1->next;
LinkList p_2 = L_2->next;
LinkList L_3 = new LNode;
LinkList p = L_3;
while (p_1 != NULL && p_2 != NULL) {
/*if (p_1->data == p_2->data) {
p->next = p_1;
p = p_1;
p_1 = p_1->next;
p_2 = p_2->next;
}*/
if (p_1->data < p_2->data) {
p->next = p_1;
p = p_1;
p_1 = p_1->next;
}
else {
p->next = p_2;
p = p_2;
p_2 = p_2->next;
}
}
if (p_1 == NULL && p_2 != NULL) {
p->next = p_2;
}
if (p_2 == NULL && p_1 != NULL) {
p->next = p_1;
}
return L_3;
}
void ListSort(LinkList &head) {
LinkList p, q;
for (p = head->next; p != NULL; p = p->next)
for (q = p->next; q != NULL; q = q->next)
if (p->data > q->data){
int t1 = p->data; p->data = q->data; q->data = t1;
}
}