#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}node;
//两个带头结点的有序单链表合并后任然有序
//先确定头结点,再在剩下的节点中选择值较小的节点链接到已排好序的尾节点
//直到有一个链表为空
node *link_merge(node *head1, node *head2)
{
node *new = NULL, *tail = NULL;
node *p = NULL, *q = NULL;
if(head1->next == NULL)
return head2;
else if(head2->next == NULL)
return head1;
p = head1->next;
q = head2->next; //p q 分别指向第一个节点
if(p->data < q->data){ //比较第一个节点的大小 确定头结点的位置
new = head1;
p = p->next;
}
else{
new = head2;
q = q->next;
}
tail = new->next; //指向已排好序的最后一个节点
while(p && q){ //将较小的节点链接到已排好序的尾节点tail后
if(p->data < q->data){
tail->next = p;
p = p->next;
}
else{
tail->next = q;
q = q->next;
}
tail = tail->next;
}
if(p){ //将未排完的节点链接到tail后
tail->next = p;
}
else{
tail->next = q;
}
return new;
}
void link_init(node *head)
{
head->next = NULL;
}
void link_delete(node *head)
{
node *tmp = NULL;
while(head->next){
tmp = head->next;
head->next = tmp->next;
free(tmp);
tmp = NULL;
}
}
int link_add_head(node *head, int val)
{
node *new = NULL;
new = (node *)malloc(sizeof(node));
if(!new)
return 0;
new->data = val;
new->next = head->next;
head->next = new;
return 1;
}
int main()
{
node head1 = {0};
node head2 = {0};
node *new = NULL;
node *tmp = NULL;
link_init(&head1);
link_init(&head2);
link_add_head(&head1, 7);
link_add_head(&head1, 6);
link_add_head(&head1, 3);
link_add_head(&head2, 9);
link_add_head(&head2, 8);
link_add_head(&head2, 5);
link_add_head(&head2, 4);
link_add_head(&head2, 2);
new = link_merge(&head1, &head2);
tmp = new->next;
while(tmp){
printf("%d ", tmp->data);
tmp = tmp->next;
}
printf("\n");
link_delete(new);
//link_delete(&head2);
return 0;
}
将两个有序单链表合并为一个有序单链表
最新推荐文章于 2024-05-01 16:00:54 发布