题目:
问题 C: DS单链表--合并
时间限制: 1 Sec 内存限制: 128 MB
提交: 682 解决: 390
[提交][状态][讨论版]
题目描述
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序
int LL_merge(LinkList& La, LinkList& Lb)
输入
第1行先输入n表示有n个数据,接着输入n个数据
第2行先输入m表示有M个数据,接着输入m个数据
输出
输出合并后的单链表数据,数据之间用空格隔开
样例输入
3 11 33 55
4 22 44 66 88
样例输出
11 22 33 44 55 66 88
代码块:
#include <iostream>
using namespace std;
class ListNode
{
public:
int data;
ListNode *next;
ListNode()
{
next = NULL;
}
};
class LinkList
{
public:
ListNode *head;
int len;
LinkList();
~LinkList();
ListNode * Index(int i);
void CreateList(int n);
void Display();
};
LinkList::LinkList()
{
head = new ListNode;
len = 0;
}
LinkList::~LinkList()
{
ListNode *p = head;
ListNode *q;
while(p)
{
q = p->next;
delete p;
p = q;
}
len = 0;
head = NULL;
}
ListNode * LinkList::Index(int i)
{
ListNode *p = head;
while(i--)
{
p = p->next;
}
return p;
}
void LinkList::CreateList(int n)
{
ListNode *p = head;
while(n--)
{
ListNode *q = new ListNode;
q->next = NULL;
cin>>q->data;
p->next = q;
p = p->next;
}
}
void LinkList::Display()
{
ListNode *p = head->next;
while(p)
{
cout<<p->data<<' ';
p = p->next;
}
cout<<endl;
}
int main(void)
{
LinkList L1, L2;
int n;
cin>>n;
L1.CreateList(n);
cin>>n;
L2.CreateList(n);
ListNode *p = L1.head->next;
ListNode *q = L2.head->next;
ListNode *r = L1.head;
delete L2.head;
L2.head = NULL;
while(p&&q)
{
if(p->data<=q->data)
{
r->next = p;
p = p->next;
r = r->next;
}
else
{
r->next = q;
q = q->next;
r = r->next;
}
}
r->next = p?p:q;
L1.Display();
return 0;
}
题解:
1.这里一共涉及到了三个链表的操作,由于是在原链表上得到新的合并链表,所以有两个链表共用一个存储指针,只需要初始的两个存储指针就行,而操作指针则需要三个。