温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。
题目描述
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序
int LL_merge(ListNode *La, ListNode *Lb)
输入
第1行先输入n表示有n个数据,接着输入n个数据
第2行先输入m表示有M个数据,接着输入m个数据
输出
输出合并后的单链表数据,数据之间用空格隔开
输入样例1
3 11 33 55 4 22 44 66 88
输出样例1
11 22 33 44 55 66 88
思路分析
这个函数的返回值是int型,我们一般创建一个新链表来作为这两个单链表的合并比把一个链表并入另一个链表的操作简单。
于是把这个写成链表的成员函数,首先记录下两个链表的开始节点,然后循环遍历两个链表,比较两个链表节点中数据的大小把小的插入新链表,直到两个链表中有一个遍历完跳出循环,之后把没遍历完的链表的剩下元素全部插入新链表尾部。
AC代码
代码语言:javascript复制#include <iostream>
using namespace std;
#define OK 0
#define ERROR -1
//结点类定义
class ListNode {
public:
int data;
ListNode * next;
ListNode() {
data = -9999, next = NULL;
}
};
class LinkList {//带头结点的单链表,位置从0到n,0是头结点,1是首结点,n是尾结点
public:
ListNode * head; //头结点
int size; //表长
LinkList(); //构造函数,创建头结点
~LinkList(); //析构函数,逐个结点回收
int LL_insert(int item, int i); //第i位置插入元素,操作成功或失败返回OK或ERROR
void LL_print(); //打印单链表所有数据
int LL_merge(ListNode *La, ListNode *Lb) {
ListNode*pa = La, *pb = Lb;
while (pa && pb) {
if (pa->data < pb->data) {
LL_insert(pa->data, size 1);
pa = pa->next;
} else {
LL_insert(pb->data, size 1);
pb = pb->next;
}
}
while (pa) {
LL_insert(pa->data, size 1);
pa = pa->next;
}
while (pb) {
LL_insert(pb->data, size 1);
pb = pb->next;
}
return 0;
}
};
LinkList::LinkList(): size(0) {
head = new ListNode();
}
LinkList::~LinkList() {
ListNode *p, *q;
p = head->next;
while (p != NULL) {
q = p;
p = p->next;
delete q;
}
size = 0;
head->next = NULL;
}
int LinkList::LL_insert(int item, int i) {
if (i < 1 || i > size 1)
return ERROR;
ListNode*p = head;
int j = 1;
while (j < i) {
p = p->next;
}
ListNode*q = new ListNode();
q->data = item;
q->next = p->next;
p->next = q;
size ;
return OK;
}
void LinkList::LL_print() {
ListNode*p = head->next;
for (int i = 1; i <= size; i ) {
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
int main() {
int n, item;
LinkList La, Lb, Lc;
cin >> n;
for (int i = 1; i <= n; i ) {
cin >> item;
La.LL_insert(item, i);
}
cin>>n;
for (int i = 1; i <= n; i ) {
cin >> item;
Lb.LL_insert(item, i);
}
Lc.LL_merge(La.head->next, Lb.head->next);
Lc.LL_print();
return 0;
}