『西工大-数据结构-NOJ』 004-单链表的归并(耿2.11) 『西北工业大学』

『西工大-数据结构-NOJ』 004-单链表的归并(耿2.11) 『西北工业大学』_第1张图片
『西工大-数据结构-NOJ』 004-单链表的归并(耿2.11) 『西北工业大学』_第2张图片

解题思路:

这道题要求将两个非递减有序的线性表(其实就是广义递增)合并为一个非递增(其实就是广义递减)链表,且使用原链表的节点储存,即只能有常数量级的额外空间开销。
既然要倒序输出,我们有限考虑头插法完成新链表。
这道题在合并的过程中我们加一个新头节点,就很好解决了。我们令新头节点为A链表的头节点,然后再新的头节点后依次插入节点即可。
具体操作见代码,代码中有部分注释。

题解代码:

#include 
#include 

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

void CreatList(Node *head,int n){//创建链表
    Node *p;
    p = (Node*)malloc(sizeof(Node));
    p = head;
    for(int i=0;i<n;i++){
        p->next = (Node*)malloc(sizeof(Node));
        scanf("%d",&p->next->data);
        p = p->next;
    }
    p->next = NULL;
}

Node *Merge(Node *head_a, Node *head_b){
    Node *p,*q,*temp,*head_new;
    p = head_a->next;
    q = head_b->next;
    head_new = head_a;
    head_new->next = NULL;
    //因为需要逆序输出,因此我们采用头插法
    while(p&&q){//当AB链表均非空
        if(p->data<=q->data){//若A节点值较小
            temp = p;
            p = p->next;
            temp->next = head_new->next;
            head_new->next = temp;
        }
        else{//若A节点值较大
            temp = q;
            q = q->next;
            temp->next = head_new->next;
            head_new->next = temp;
        }
    }
    //接下来一定会剩余一条有序空链表,亦或是两条链表全空
    while(p){
        temp = p;
        p = p->next;
        temp->next = head_new->next;
        head_new->next = temp;
    }
    while(q){
        temp = q;
        q = q->next;
        temp->next = head_new->next;
        head_new->next = temp;
    }
    free(head_b);//释放B链表头节点
    return head_new;
}

void PrintList(Node *head){//输出链表
    Node *p = head->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
}

int main(){
    int m,n;
    Node *head_a,*head_b;
    head_a = (Node*)malloc(sizeof(Node));
    head_b = (Node*)malloc(sizeof(Node));
    scanf("%d %d",&m,&n);
    CreatList(head_a,m);
    CreatList(head_b,n);
    PrintList(Merge(head_a,head_b));
    return 0;
}

你可能感兴趣的:(『西工大-数据结构-NOJ』)