排序好的两个链表的合并

将来个排好序的链表合并为一个链表,使用一个临时指针,接着使用两个指向两个链表的头的指针,然后比较这两个链表节点的数据大小,临时指针指向小的节点,更新指向小的链表头的指针使其指向下一个节点。重复此过程直到其中一个链表遍历完毕,另一个没有遍历完的链表插到链表尾即可实现两个链表的合并。具体的实现代码如下:

//此程序用于实现两个排好序的链表的合并
#include<iostream>
#include<stdlib.h>
struct LinkNode {
	int val;
	LinkNode* nextnode;
	LinkNode(int x) :val(x), nextnode(NULL) { }
};
/*LinkNode* Merge1(LinkNode* l1, LinkNode* l2) {//实现两个排好序的链表的和并(并未使用临时头节点)
	LinkNode* temphead =NULL;//临时头指针
	//刚开始排序时临时头结点的情形
	if (l1->val < l2->val) {
		temphead = l1;
		l1 = l1->nextnode;
	}
	else {
		temphead = l2;
		l2 = l2->nextnode;
	}
	LinkNode *tempnode=temphead;
	while (l1 && l2) {
		if (l1->val < l2->val) {
		   tempnode->nextnode = l1;
		   l1 = l1->nextnode;
		}
		else {
			tempnode->nextnode = l2;
			l2 = l2->nextnode;
		}
		
		tempnode = tempnode->nextnode;
	}
	if (l1) {
		tempnode->nextnode = l1;
	}
	if(l2) {
		tempnode->nextnode = l2;
	}
	return temphead;
}*/
LinkNode* Merge2(LinkNode* l1, LinkNode* l2) {//使用临时头节点来实现两个排好序连接表的合并
	LinkNode temphead(0);
	LinkNode* pre = &temphead;
	while (l1 && l2) {
		if (l1->val < l2->val) {
			pre->nextnode = l1;
			l1 = l1->nextnode;
		}
		else {
			pre->nextnode = l2;
			l2 = l2->nextnode;
		}
		pre = pre->nextnode;
	}
	if (l1) {
		pre->nextnode = l1;
	}
	else {
		pre->nextnode = l2;
	}
	return temphead.nextnode;
}
void print(LinkNode* l){
	while (l) {
		printf("[%d] ", l->val);
		l = l->nextnode;
	}
	printf("\n");
}
int main() {
	LinkNode a(1);
	LinkNode b(2);
	LinkNode c(3);
	LinkNode d(4);
	LinkNode e(5);
	LinkNode f(6);
	LinkNode g(7);

	LinkNode* l1 = &b;
	b.nextnode = &e;
	e.nextnode = &f;
	LinkNode* l2 = &a;
	a.nextnode = &c;
	c.nextnode = &d;
	d.nextnode=&g;

	printf("合并前:\n");
	print(l1);
	print(l2);

	printf("合并后:\n");
	//printf("使用Merge1函数:");
	//LinkNode* L1 = Merge1(l1, l2);
	//print(L1);
	printf("使用Merge2函数:");
	LinkNode* L2=Merge2(l1, l2);
	print(L2);
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值