#include <stdio.h>
#include <stdlib.h>
struct list
{
int data;
struct list *next;
};
typedef struct list L;
L *insert (L *head, int data)//尾插
{
L *new = calloc(1, sizeof(L));
new->data = data;
new->next = NULL;
if(head == NULL)
head = new;
else
{
L *tmp = head;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = new;
}
return head;
}
L *mergeList(L *head1, L *head2)//合并
{
L *merge = NULL;
L *node1 = head1;
L *node2 = head2;
//先找到新链表的头
if(head1 == NULL && head2 == NULL)
return merge;
else if (head1 == NULL && head2 != NULL)
return head2;
else if (head2 == NULL && head1 != NULL)
return head1;
else
{
if(head1->data >= head2->data)
{
merge = head2;
head2 = head2->next;
}
else
{
merge = head1;
head1 = head1->next;
}
}
L *tmp = merge;
//比较两个链表的首个节点 然后将data较小的节点插入到新链表中
//如果在比较当中某个链表已经遍历完,则直接将另个链表直接插入到新链表中
while(head1 != NULL || head2 != NULL)
{
if (head1 == NULL && head2 != NULL)
{
tmp->next = head2;
break;
}
else if(head2 == NULL && head1 != NULL)
{
tmp->next = head1;
break;
}
else
{
if (head1->data >= head2->data)
{
tmp->next = head2;
head2 = head2->next;
}
else
{
tmp->next = head1;
head1 = head1->next;
}
}
tmp = tmp->next;
}
return merge;
}
void travel(L *head)
{
L *node = head;
while(node!= NULL)
{
printf("data:%d\n", node->data);
node = node->next;
}
return;
}
int main()
{
L *head1 = NULL;
L *head2 = NULL;
L *head3 = NULL;
int i = 0;
for(i = 0; i < 10; i = i + 2)
{
head1 = insert(head1, i);
}
for(i = 1; i < 20; i = i + 2)
{
head2 = insert(head2, i);
}
travel(head1);
printf("\n");
travel(head2);
printf("\n");
head3 = mergeList(head1, head2);
travel(head3);
return 0;
}
输出
data:0
data:2
data:4
data:6
data:8
data:1
data:3
data:5
data:7
data:9
data:11
data:13
data:15
data:17
data:19
data:0
data:1
data:2
data:3
data:4
data:5
data:6
data:7
data:8
data:9
data:11
data:13
data:15
data:17
data:19