【数据结构-单链表】单链表的归并

来源:互联网 发布:ubuntu自带中文输入法 编辑:程序博客网 时间:2024/06/10 04:56

问题描述:有两个单链表,按从小到大的顺序排列,先将两链表按从小到大的顺序合并。且所用的存储空间最小。

//单链表的合并 #include<stdio.h>#include<stdlib.h>typedef struct node{    int date;    struct node *next;}Lnode,*Pnode;//初始化单链表Pnode init_create_Linklist(void){    Pnode H;    H=(Pnode)malloc(sizeof(Lnode));    if(H){        H->next=NULL;    }    return H;}//尾插法新建单链表Pnode tail_Build_Linklist(Pnode H,int length){    Pnode p,q;    q=H;    for(int i=1;i<=length;i++){        p=(Pnode)malloc(sizeof(Lnode));        scanf("%d",&p->date);        q->next=p;        q=p;    }    q->next=NULL;     return H;}//打印单链表void print_Linklist(Pnode H){    Pnode p;    p=H->next;    while(p!=NULL){        printf("%d->",p->date);        p=p->next;      }}Pnode merge_Linklist(Pnode A,Pnode B){    Pnode C,p,q,R;    p=A->next;    q=B->next;    C=A;    free(B);    while(p&&q){    if(p->date<q->date){        R=p;        C->next=R;        C=C->next;        p=p->next;    }else{        R=q;        C->next=R;        C=C->next;        q=q->next;    }}    if(p){        C->next=p;    }      if(q){        C->next=q;    }    return A;}int main(void){    Pnode H1,H2,H;    H1=init_create_Linklist();    H1=tail_Build_Linklist(H1,3);    print_Linklist(H1);    H2=init_create_Linklist();    H2=tail_Build_Linklist(H2,3);    print_Linklist(H2);    H=merge_Linklist(H1,H2);    print_Linklist(H);    return 0;} 

总结一下细节:单链表问题主要有三个方面要注意
1.指针的指向问题,即逻辑思路。(指针基础)
2.更新问题,即存储顺序。(小细节)
3.健壮性问题
3.1减少假设。对内存分配时要验证分配是否成功。
3.2临界状态的验证问题。大于表长或者循环退出的条件分析或者具体问题头尾结点的处理问题。

0 0
原创粉丝点击