16 链表-合并两个排序的链表

本文介绍了一种合并两个已排序链表的方法,通过比较两个链表的元素,将它们合并成一个新的排序链表。代码实现了链表的初始化、合并及遍历功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

分析:

    //将两个单调链表合并成一个链表
    //两个链表长度相同、q1对q2长,q2比q1长,是否为空;
//    先考虑两个链表长度相同,之后在考虑链表长度不一样

思路:

 

完整代码

代码还有点问题,待调试

#include<stdio.h>
#include<malloc.h> 
/*单链表实现:合并两个排序的链表*/ 
typedef struct Link
{
	char elem;    //代表数据域
	struct Link * next;  //代表指针域,指向直接后继元素 
}link;

link *init();
link *init2();
link *combine();

int main(){
	link *phead1;
	phead1 = init();
	link *phead2 = init2();
	link *phead = combine(phead1,phead2);
	while(phead != NULL){
//		phead = phead->next;
		printf("%d\n",phead->elem);
		phead = phead->next;
	}
	return 0;
}

link *init(){
	link *head = (link *)malloc(sizeof(link));
	head->next = NULL;
	link *temp = head;
	int i;
	for(i=1;i<8;)
	{
		link *body = (link *)malloc(sizeof(link));
		body->next = NULL;
		body->elem = i;
		i=i+2;
		temp->next = body;
//		printf("p1:%d ",temp->elem);
		temp= temp->next;
		printf("p1:%d ",temp->elem);
	}
	return head;
}

link *init2(){
	link *head = (link *)malloc(sizeof(link));
	head->next = NULL;
	link *temp = head;
	int i;
	for(i=0;i<8;)
	{
		link *body = (link *)malloc(sizeof(link));
		body->next = NULL;
		body->elem = i+2;
		i=i+2;
		temp->next = body;
		
		temp= temp->next;
		printf("p2:%d ",temp->elem);
	}
	return head;
}

link *combine(link *q1,link *q2){
	link *q =  (link *)malloc(sizeof(link));
	q->next = NULL;
	link *temp = q;
	int flag = 0;
	//将两个单调链表合并成一个链表
	//两个链表长度相同、q1对q2长,q2比q1长,是否为空;
//	先考虑两个链表长度相同,之后在考虑链表长度不一样
	if(q1 == NULL){
		return q2;
	 } 
	 if(q2 == NULL){
	 	return q1;
	 }
//	 先确定头结点 
	 while(q1 && q2){
	 	 
	 	if(q1->elem <= q2->elem){
	 		//初始化结点 
	 		link *body = (link *)malloc(sizeof(link));
	 		body->next = NULL;
	 		body->elem = q1->elem;
	 		//新增结点 
	 		temp->next = body;
	 		//指向下一个结点 
	 		temp = temp->next;	
	 		flag = 0;
		}
		 else{
		 	link *body = (link *)malloc(sizeof(link));
	 		body->next = NULL;
	 		body->elem = q2->elem;
	 		temp->next = body;
	 		temp = temp->next;	
	 		flag  = 1;
		}
		
		 if(flag == 0){
		 	q1 = q1->next;
		 } else{
		 	q2 = q2->next;
		 }
		 
	 }
	 
	 return q;
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值