C.DS单链表--合并

【题目描述】

假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序

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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值