假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序
int LL_merge(ListNode *La, ListNode *Lb)
Input
第1行先输入n表示有n个数据,接着输入n个数据
第2行先输入m表示有M个数据,接着输入m个数据
Output
输出合并后的单链表数据,数据之间用空格隔开
Sample
#0
Input
Copy
3 11 33 55 4 22 44 66 88
Output
Copy
11 22 33 44 55 66 88
#include<iostream>
using namespace std;
#define ok 0
#define error -1
// 链表结点定义
class ListNode
{
public:
int data;
ListNode* next;
ListNode() { next = NULL; }
};
// 带头结点的单链表类定义
class LinkList
{
public:
ListNode* head;
int len;
// 操作定义
LinkList();
~LinkList();
ListNode* LL_index(int i); // 返回第i个结点的指针,如果不存在返回NULL
int LL_get(int i); // 获取第i个元素的数据
int LL_insert(int i, int item); // 把数值item插入第i个位置
int LL_del(int i); // 删除第i个结点
void LL_display(); // 输出单链表的内容
int LL_merge(ListNode* La, ListNode* Lb);//合并
};
LinkList::LinkList()
{
head = new ListNode();
len = 0;
}
LinkList::~LinkList()
{
ListNode* p, * q;
p = head;
while (p != NULL)
{
q = p;
p = p->next;
delete q;
}
len = 0;
head = NULL;
}
void LinkList::LL_display()
{
ListNode* p;
p = head->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
// 返回第i个结点的指针,如果不存在返回NULL 找链表第i个结点
ListNode* LinkList::LL_index(int i)
{
int j = 0;
ListNode* p = head;//指向头指针
while (p && j < i)//遍历
{
p = p->next;
j++;
}
if (!p) return NULL;
else return p;
}
//获得数据 获取第i个元素的数据
int LinkList::LL_get(int i)
{
if (i <= 0 || i > len) return error;
int j = 0;
ListNode* p = head;//指向头指针
while (p && j < i)//遍历
{
p = p->next;
j++;
}
if (!p) return error;
else return p->data;
}
//插入
int LinkList::LL_insert(int i, int item)
{
//判断存在
if (i <= 0 || i > len + 1) return error;
else
{
ListNode* p;
ListNode* pr = head;
p = head->next;//p指向头节点后一位
ListNode* n;
for (int j = 1; j < i; j++) {
if (p != NULL) {
pr = p;
p = p->next;//p和pr都往下走一位
}
}//循环结束此时pr为i-1 p为i
n = new ListNode;//为其分配内存空间
n->data = item;
//这里进行插入操作 将n插入到第i个位置
pr->next = n;
n->next = p;
len++;
return 1;
}
}
//删除
int LinkList::LL_del(int i)
{
if (i <= 0 || i > len) return error;
ListNode* p, * s;
p = LL_index(i - 1);//p是链表第i-1
s = p->next;//s是p的下一位 s是i
p->next = s->next;//p的下一位 是s的下一位 p过后是i+1
//这样子就跳过了i
delete s;
len--;
return ok;
}
//合并
int LinkList::LL_merge(ListNode* La, ListNode* Lb) {
while (La && Lb)//节点都得存在
{
if (La->data > Lb->data)
{
this->LL_insert(++len, Lb->data);//b值小 所以插入b值
Lb = Lb->next;//Lb往后走一位
}
else//同理插入a
{
this->LL_insert(++len, La->data);
La = La->next;
}
}
//ab链表长度不一样的情况 较长的链表还要继续插入
while (La) {
this->LL_insert(++len, La->data);
La = La->next;
}
while (Lb) {
this->LL_insert(++len, Lb->data);
Lb = Lb->next;
}
return ok;
}
int main()
{
int n, m;
LinkList mylist1;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> m;
mylist1.LL_insert(i, m);//插入
};
// mylist1.LL_display();
LinkList mylist2;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> m;
mylist2.LL_insert(i, m);//插入
}
// mylist2.LL_display();
LinkList mylist;
mylist.LL_merge(mylist1.head->next, mylist2.head->next);//合并
mylist.LL_display();
}