递归方法:
#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;
}