C语言实现将两个递增有序的链表合并成一个非递减有序链表

30 篇文章 0 订阅
27 篇文章 1 订阅

1. 问题描述:

A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由链表A和B的节点组成

2. 思路分析:

① 因为A和B都是递增有序的,要使归并后的链表还是有序的,可以从A和B中挑选出最小的元素,插入到C的尾部,这样当A和B中的元素都插入到C中的时候一定是有序的,所以需要定义两个指针分别指向链表A和链表B,这样才可以对指向的链表的元素进行移动

② 有可能我们在最后的时候有一个链表元素都被遍历完了,另外一个还有没有遍历完的元素那么这个时候需要判断一下,将指向链表C指针的next指针指向剩余的另外一个链表没有被遍历完的元素的起始位置

③ 需要注意的一个问题是我们在全局中声明了三个指针变量,而且我们需要在合并函数执行完了之后那么主函数中链表C是同步修改的,也就是我们在主函数中可以得到合并的链表这样就可以对链表进行遍历,这个时候在合并的方法中需要传入一个引用(*&C),也就是像下面这样,这样在主函数中得到的才是合并后的链表,假如没有加上这个引用那么链表C还是一个空的链表

void merge(LNode *A, LNode *B, LNode *&C){
}

3. 具体的代码如下:

使用for循环来创建的链表:

#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
	int data;
	LNode *next;
}LNode;
LNode *A, *B, *C;
void merge(LNode *A, LNode *B, LNode *&C){
	LNode *p = A->next;
	LNode *q = B->next;
	LNode *r;
	C = A;
	C->next = NULL;
	free(B);
	r = C;
	while(p != NULL && q != NULL){
		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 = NULL;
	if(p != NULL){
		r->next = p;
	}
	if(q != NULL){
		r->next = q;
	}
}

void createLinkList(){
	LNode *pa;
	LNode *pb;
	//创建AB链表的头结点 
	A = (LNode*)malloc(sizeof(LNode));
	B = (LNode*)malloc(sizeof(LNode));
	pa = A;
	pb = B;
	//一开始的是要将其指针域赋值为空 
	pa->next = NULL;
	pb->next = NULL;
	
	for(int i = 1; i <= 20; i += 4){
		LNode *newNode = (LNode*)malloc(sizeof(LNode));
		newNode->data = i;
		pa->next = newNode;
		pa = pa->next;
	} 
	pa->next = NULL;
	for(int i = 2; i <= 8; i += 2){
		LNode *newNode = (LNode*)malloc(sizeof(LNode));
		newNode->data = i;
		pb->next = newNode;
		pb = pb->next;
	} 
	pb->next = NULL;
}

int main(void){
	createLinkList();
	merge(A, B, C);
	LNode *p = C;
	while(p->next != NULL){
		printf("%d ", p->next->data);
		p = p->next;
	} 
	return 0;
} 

直接手动创建链表:

#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct LNode{
	int data;
	LNode *next;
}LNode;
LNode *A, *B, *C;
void merge(LNode *A, LNode *B, LNode *&C){
	LNode *p = A->next;
	LNode *q = B->next;
	LNode *r;
	C = A;
	C->next = NULL;
	free(B);
	r = C;
	while(p != NULL && q != NULL){
		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 = NULL;
	if(p != NULL){
		r->next = p;
	}
	if(q != NULL){
		r->next = q;
	}
}

void createLinkList(){
	// headA与headB是用来调试的 
	LNode *t1, *headA;
	LNode *t2, *headB;
	A = (LNode*)malloc(sizeof(LNode));
	B = (LNode*)malloc(sizeof(LNode));
	t1 = A;
	headA = A;
	t2 = B;
	headB = B;
	A->next = NULL;
	B->next = NULL;
	
	LNode *A1 = (LNode*)malloc(sizeof(LNode));
	A1->data = 1;
	LNode *A3 = (LNode*)malloc(sizeof(LNode));
	A3->data = 3;
	LNode *A5 = (LNode*)malloc(sizeof(LNode));
	A5->data = 5;
	LNode *A7 = (LNode*)malloc(sizeof(LNode));
	A7->data = 7;
	LNode *A9 = (LNode*)malloc(sizeof(LNode));
	A9->data = 9;
	A9->next = NULL;
	t1->next = A1;
	t1 = t1->next;
	t1->next = A3;
	t1 = t1->next;
	t1->next = A5;
	t1 = t1->next;
	t1->next = A7;
	t1 = t1->next;
	t1->next = A9;
	t1 = t1->next;
	
	
	LNode *B2 = (LNode*)malloc(sizeof(LNode));
	B2->data = 2;
	LNode *B4 = (LNode*)malloc(sizeof(LNode));
	B4->data = 4;
	LNode *B6 = (LNode*)malloc(sizeof(LNode));
	B6->data = 6;
	LNode *B8 = (LNode*)malloc(sizeof(LNode));
	B8->data = 8;
	B8->next = NULL;
	
	t2->next = B2;
	t2 = t2->next;
	t2->next = B4;
	t2 = t2->next;
	t2->next = B6;
	t2 = t2->next;
	t2->next = B8;
}

int main(void){
	createLinkList();
	merge(A, B, C);
	LNode *p = C;
	while(p->next != NULL){
		printf("%d ", p->next->data);
		p = p->next;
	} 
	return 0;
} 

 

  • 0
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值