链表-----合并两个有序链表(非交叉)

递归方法:

#include<stdio.h>
#include "malloc.h"
typedef struct ListNode
{
	int data;
	struct ListNode *next;
}linklist;

linklist *head = NULL;


linklist *CreateList(int *arr, int len)
{
	linklist* p, *rear;
	head = (linklist*)malloc(sizeof(linklist));
	head->data = arr[0];
	rear = head;
	int count = 1;
	while (count < len - 1)
	{
		p = (linklist*)malloc(sizeof(linklist));
		p->data = arr[count];
		rear->next = p;
		rear = p;
		count++;
	}
	rear->next = NULL;
	return head;
}
//递归方法
linklist *MergeTwoList(linklist *head1, linklist *head2)
{
//设两个头节点分别为head1,head2,当head1空时返回head2,当head2空时返回head1;
	if (head1 == NULL)
		return head2;
	if (head2 == NULL)
		return head1;
	linklist *head = NULL;
//head1第一个数据小于head2第一个数据时,把head1链表第一个元素存储到新的链表中
//递归遍历去除第一个元素的head1链表和head2链表;同理head2-data < head1->data;
	if (head1->data <= head2->data)
	{
		head = head1;
		head->next = MergeTwoList(head1->next, head2);
	}
	else
	{
		head = head2;
		head->next = MergeTwoList(head1, head2->next);
	}
	
	return head;
}

//主函数
int main()
{
	int array1[] = { 1,3,5,7,9 };
	int array2[] = { 2,4,6,8,10 };
	int len1 = sizeof(array1) / sizeof(array1[0]);
	int len2 = sizeof(array2) / sizeof(array2[0]);
	linklist *head1 = CreateList(array1, len1);
	linklist *head2 = CreateList(array2, len2);
	linklist *MergeHead = MergeTwoList(head1, head2);
	for (int i = 0;i < (len1 + len2);++i)
	{
		printf("%d ", MergeHead->data);
		MergeHead = MergeHead->next;
	}
	return 0;
}

非递归:

#include<stdio.h>
#include "malloc.h"
typedef struct ListNode
{
	int data;
	struct ListNode *next;
}linklist;

linklist *head = NULL;


linklist *CreateList(int *arr, int len)
{
	linklist* p, *rear;
	
	head = (linklist*)malloc(sizeof(linklist));
	head->data = arr[0];
	rear = head;
	int count = 1;
	while (count < len - 1)
	{
		p = (linklist*)malloc(sizeof(linklist));
		p->data = arr[count];
		rear->next = p;
		rear = p;
		count++;
	}
	rear->next = NULL;
	return head;
}
//非递归方法
linklist *MergeTwoList(linklist *head1, linklist *head2)
{
	
	linklist *NewHead = NULL;
	if (head1->data <= head2->data)
	{
		NewHead = head1;
		head1 = head1->next;
	}
	else
	{
		NewHead = head2;
		head2 = head2->next;
	}
	linklist *tmp = NewHead;
	while (head1 != NULL && head2 != NULL)
	{
		if (head1->data <= head2->data)
		{
			tmp->next = head1;
			tmp = head1;
			head1 = head1->next;
		}
		else
		{
			tmp->next = head2;
			tmp = head2;
			head2 = head2->next;
		}
	}
	if (head1!=NULL)
	{
		tmp->next = head1;
		tmp = head1;
	}
	if (head2!=NULL)
	{
		tmp->next = head2;
		tmp = head2;
	}
	tmp->next = NULL;
	return NewHead;
}
//主函数
int main()
{
	int array1[] = { 1,3,5,7 };
	int array2[] = { 2,4,6,8};
	int len1 = sizeof(array1) / sizeof(array1[0]);
	int len2 = sizeof(array2) / sizeof(array2[0]);
	linklist *head1 = CreateList(array1, len1);
	linklist *head2 = CreateList(array2, len2);
	
	linklist *MergeHead = MergeTwoList(head1, head2);
	for (int i = 0;i < (len1 + len2);i++)
	{
		printf("%d ", MergeHead->data);
		MergeHead = MergeHead->next;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81384099