您的位置:首页 > 其它

两个有序单链表合并

2014-05-16 20:54 253 查看
与将两个有序数组合并的思路一致,需要三个指针。

【代码】

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
int data;
struct node *next;
}Node;

Node *Merge(Node *head1,Node *head2)
{
Node *head;
Node *p1=head1->next;
Node *p2=head2->next;
//单链表为空的情况
if(head1==NULL)
return head2;
if(head2=NULL)
return head1;
//找出两个链表中第一个结点值较小的结点,并使head指向该结点
if(p1->data<p2->data)
head=head1;
else
head=head2;
Node *pcur=head;
while(p1&&p2)
{
if(p1->data<p2->data)
{
//满足要求的结点放在pcur指向的节点后面,所以pcur初始化必须指向头结点,不能指向第一个结点
pcur->next=p1;
pcur=p1;
p1=p1->next;
pcur->next=NULL;
}
else
{
pcur->next=p2;
pcur=p2;
p2=p2->next;
pcur->next=NULL;
}
}
//将剩余的结点连接到pcur上,完成整个合并过程
if(p1)
pcur->next=p1;
if(p2)
pcur->next=p2;
return head;
}

void main()
{
Node *head1,*p,*k1;
head1=(Node *)malloc(sizeof(Node));
head1->next=NULL;
Node *head2,*q,*k2;
head2=(Node *)malloc(sizeof(Node));
head2->next=NULL;
Node *result;
int i;
//头插法建立带头结点的链表
for(i=4;i>0;i--)
{
p=(Node *)malloc(sizeof(Node));
p->data=i;
p->next=head1->next;
head1->next=p;
}
for(i=6;i>2;i--)
{
q=(Node *)malloc(sizeof(Node));
q->data=i;
q->next=head2->next;
head2->next=q;
}

result=Merge(head1,head2);
result=result->next;
while(result)
{
printf("%d ",result->data);
result=result->next;
}
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: