注意:本题中La与Lb链中元素按值非递减。
算法思想,用两个指针分别指向La和Lb的第一个数据节点,每次选La和Lb较小值尾插到Lc中,如果待插入节点与尾节点相同,则释放该节点,反之则追加到尾部;重复上述步骤,直到其中一条链被搜索完,将另外一条链每个元素依次插入到Lc尾部。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
LinkNode* next;
}LinkNode, * LinkList;
void creatLinklist(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* ptail = L;
int num;
while (scanf("%d", &num) && num < 99999) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
}
//算法思想,用两个指针分别指向La和Lb的第一个数据节点,每次选La和Lb较小值尾插到Lc中,
//如果待插入节点与尾节点相同,则释放该节点,反之则追加到尾部;
//重复上述步骤,直到其中一条链被搜索完,将另外一条链每个元素依次插入到Lc尾部
void insert(LinkNode*& ptail, LinkNode* temp) {
if (temp->data == ptail->data) {
free(temp);
}
else {
temp->next = ptail->next;
ptail->next = temp;
ptail = temp;
}
}
//注意插入时候的顺序,否则会引起断链
void combinesortLinklist(LinkList& La, LinkList& Lb, LinkList& Lc) {
LinkNode* pmoveA = La->next;
LinkNode* pmoveB = Lb->next;
La->next = NULL;
Lc = La;
LinkNode* ptail = Lc;
free(Lb);
while (pmoveA && pmoveB) {
if (pmoveA->data < pmoveB->data) {
LinkNode* temp = pmoveA;
pmoveA = pmoveA->next;
insert(ptail, temp);
}
else if (pmoveA->data > pmoveB->data) {
LinkNode* temp = pmoveB;
pmoveB = pmoveB->next;
insert(ptail, temp);
}
else {
LinkNode* temp = pmoveA;
pmoveA = pmoveA->next;
pmoveB = pmoveB->next;
insert(ptail, temp);
}
}
while (pmoveA != NULL) {
LinkNode* temp = pmoveA;
pmoveA = pmoveA->next;
insert(ptail, temp);
}
while (pmoveB != NULL) {
LinkNode* temp = pmoveB;
pmoveB = pmoveB->next;
insert(ptail, temp);
}
}
void printLinklist(LinkList L) {
LinkNode* pnode = L->next;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
printf("\n");
}
int main() {
LinkList La = NULL;
LinkList Lb = NULL;
LinkList Lc = NULL;
creatLinklist(La);
creatLinklist(Lb);
combinesortLinklist(La, Lb, Lc);
printLinklist(Lc);
return 0;
}