两个有序单链表合并

来源:互联网 发布:淘宝甩手掌柜工具箱 编辑:程序博客网 时间:2024/06/05 22:40

与将两个有序数组合并的思路一致,需要三个指针。

【代码】

#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;elsehead=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");}


0 1