【题目描述】
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序
int LL_merge(ListNode *La, ListNode *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 \n
#include<iostream>
using namespace std;
class ListNode {
public:
int data;
ListNode* next;
ListNode() {
next = NULL;
}
};
class LinkList {
public:
ListNode* head;
int len;
LinkList() {
head = new ListNode();
len = 0;
}
~LinkList() {
ListNode* p = head;
ListNode* q;
while (p!=NULL) {
q = p;
p = p->next;
delete q;
}
head = NULL;
len = 0;
}
ListNode* LL_index(int i);
int LL_insert(int i,int item);
int LL_merge(ListNode* La, ListNode* Lb);
void LL_display();
};
ListNode* LinkList::LL_index(int i) {
ListNode* p = head;
if (i == 0) {
return p;
}
int j = 1;
p = p->next;
while ((p != NULL)&&(j < i)) {//这里是&&,不是||
p = p->next;
j++;
}
return p;
}
int LinkList::LL_insert(int i, int item) {
if ((i <= 0) || (i > len + 1)) {
return 0;
}
ListNode* p = LL_index(i - 1);
if (p == NULL) {
return 0;
}
ListNode* s = new ListNode();
s->data = item;
s->next = p->next;
p->next = s;
len++;
return 1;
}
int LinkList::LL_merge(ListNode* La, ListNode* Lb) {
ListNode* Lc = La;
if (!(La && Lb)) {
return 0;
}
ListNode* p = La->next, * q = Lb->next, * r = Lc;//为什么lc不用next,看下面就知道了
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;
}
}
if (p != NULL) {//表一不空,则新表加上表一
r->next = p;
p = p->next;
r = r->next;
}
if (q != NULL) {//表二不空,新表加上表二
r->next = q;
q = q->next;
r = r->next;
}
//r->next = p ? p : q;//r的下一个结点 是否为p,则返回p,否则为q
head = Lc;
Lb->next = NULL;
return 1;
}
void LinkList::LL_display() {
ListNode* p = head->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
int len1, item1;
cin >> len1;
LinkList mylist1;
for (int i = 1; i <= len1; i++) {
cin >> item1;
mylist1.LL_insert(i, item1);
}
//mylist1.LL_display();
int len2, item2;
cin >> len2;
LinkList mylist2;
for (int i = 1; i <= len2; i++) {
cin >> item2;
mylist2.LL_insert(i, item2);
}
//mylist2.LL_display();
//LinkList mylist3;//不应该新建,就算要,也要规定长度,因为此时len=0;运行时异常
mylist1.LL_merge(mylist1.head, mylist2.head);
mylist1.LL_display();
return 0;
}