C有序单链表的合并

C有序单链表的合并

#include <stdio.h>
#include <stdlib.h>
#include "../include/List.h"//建立和打印链表的函数在头文件中 

//将链表 list1与 list2合并成 list3 参数:两个要合并的链表的头结点地址 
Node* CombineList(Node* list1,Node *list2)
{
	//定义两个指针,并分别指向两个链表的首结点 
	Node* p=list1->next;
	Node* q=list2->next;
	
	//尾插法创建一个新链表 list3 
	Node* list3=malloc(sizeof(int));
	Node* last;
	list3->next=NULL;
	last=list3;
	
	//当两个指针指向的结点均不为空 
	while(p!=NULL&&q!=NULL)
	{
		Node* newNode=malloc(sizeof(int));
		//若p指针指向的结点的数据大于q指针指向结点的数据,则为 list3 创建一个新结点 ,并将其 data 赋值为较小的数据 
		if(p->data>=q->data)
		{			
			newNode->data=q->data;
			newNode->next=NULL;
			last->next=newNode;
			last=newNode;
			
			q=q->next;			
		}
		else//反之基本同上 
		{
			newNode->data=p->data;
			newNode->next=NULL;
			last->next=newNode;
			last=newNode;
			
			p=p->next;	
		}			
	}
	//循环结束,意味着 p,q 其中一个指针必定指向空 
	if(p==NULL)//若是 p 指向空 ,则将 q 剩下的数据一一赋值给新建结点,并连接到 list3上 
	{
		while(q!=NULL)
		{
			Node* newNode=malloc(sizeof(int));
			newNode->data=q->data;
			newNode->next=NULL;
			last->next=newNode;
			last=newNode;
			
			q=q->next;		
		}	
	}
	else//若是 q 指向空 ,基本同上 
	{
		while(p!=NULL)
		{
			Node* newNode=malloc(sizeof(int));
			newNode->data=p->data;
			newNode->next=NULL;
			last->next=newNode;
			last=newNode;
			
			p=p->next;		
		}	
	}  	
	return list3;
}


int main(int argc, char *argv[]) {
	
	//建立链表
	Node* list1=CreateList();
	Node* list2=CreateList();
	//合并
	Node* list3=CombineList(list1,list2);
	//打印
	PrintList(list3);
	
	system("pause");
	return 0;
}

建立和打印链表的头文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言单链表有序合并的代码: ``` #include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node* next; }Node; Node* CreateListNode(int data){ Node* pNew = (Node*)malloc(sizeof(Node)); if (pNew == NULL){ printf("Error: out of memory!\n"); exit(1); } pNew->data = data; pNew->next = NULL; return pNew; } void PrintList(Node* head){ Node* pNode = head; if (pNode == NULL){ printf("Error: empty list!\n"); return; } while (pNode != NULL){ printf("%d ", pNode->data); pNode = pNode->next; } printf("\n"); } Node* MergeSortedList(Node* head1, Node* head2){ if (head1 == NULL) return head2; else if (head2 == NULL) return head1; Node* pMerge = NULL; if (head1->data < head2->data){ pMerge = head1; pMerge->next = MergeSortedList(head1->next, head2); } else{ pMerge = head2; pMerge->next = MergeSortedList(head1, head2->next); } return pMerge; } int main(){ int data1[] = {1, 3, 4, 6, 8}; int data2[] = {-2, 0, 2, 3, 5, 7, 9}; int len1 = sizeof(data1)/sizeof(data1[0]); int len2 = sizeof(data2)/sizeof(data2[0]); Node* head1 = CreateListNode(data1[0]); Node* head2 = CreateListNode(data2[0]); Node* pNode = head1; for (int i=1; i<len1; ++i){ pNode->next = CreateListNode(data1[i]); pNode = pNode->next; } pNode = head2; for (int i=1; i<len2; ++i){ pNode->next = CreateListNode(data2[i]); pNode = pNode->next; } printf("List1: "); PrintList(head1); printf("List2: "); PrintList(head2); Node* mergedHead = MergeSortedList(head1, head2); printf("Merged list: "); PrintList(mergedHead); return 0; } ``` 这段代码可以实现两个有序单链表合并,时间复杂度为O(m+n),其中m和n分别是两个链表的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值