栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于链表的两个非递减有序序列的合并

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于链表的两个非递减有序序列的合并

将两个非递减有序序列合并为另一个非递增有序序列。

输入样例:
5 5
1 3 5 7 9
2 4 6 8 10
5 6
1 2 2 3 5
2 4 6 8 10 12
0 0

输出样例:
10 9 8 7 6 5 4 3 2 1
12 10 8 6 5 4 3 2 2 2 1

#include 
#include 

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *linkList;

linkList ListInit();
void ListDestroy(linkList *head);
void ListTailInsert(linkList head, int x);
void ListShow(linkList head);
void ListMerge(linkList A, linkList B);
void ListInvert(linkList head);

int main() {
    int m, n;

    while (scanf("%d %d%*c", &m, &n) && m && n) {
        linkList A = ListInit();
        linkList B = ListInit();
        int x;

        for (int i = 0; i < m; i++) {
            scanf("%d%*c", &x);
            ListTailInsert(A, x);
        }
        for (int i = 0; i < n; i++) {
            scanf("%d%*c", &x);
            ListTailInsert(B, x);
        }
        ListMerge(A, B);
        ListShow(A);
        ListDestroy(&A);
        ListDestroy(&B);
    }
    return 0;
}

linkList ListInit() {
    linkList head = (linkList) malloc(sizeof(LNode));

    head->data = 0;
    head->next = NULL;
    return head;
}

void ListDestroy(linkList *head) {
    LNode *tmp;

    while (*head) {
        tmp = *head;
        *head = (*head)->next;
        free(tmp);
    }
}

void ListTailInsert(linkList head, int x) {
    LNode *newNode = (LNode *) malloc(sizeof(LNode)), *tail = head;

    newNode->data = x;
    newNode->next = NULL;
    while (tail->next) tail = tail->next;
    tail->next = newNode;
}

void ListShow(linkList head) {
    for (LNode *cursor = head->next; cursor; cursor = cursor->next) {
        printf("%d%c", cursor->data, cursor->next ? 32 : 10);
    }
}

void ListMerge(linkList A, linkList B) {
    LNode *curA = A, *curB = B, *tmp;

    while (curA->next && curB->next) {
        if (curA->next->data < curB->next->data) {
            curA = curA->next;
        } else {
            
            tmp = curB->next->next;
            curB->next->next = curA->next;
            curA->next = curB->next;
            curB->next = tmp;
            curA = curA->next;
        }
    }
    if (curB->next) {
        curA->next = curB->next;
        curB->next = NULL;
    }
    ListInvert(A);
}

void ListInvert(linkList head) {
    LNode *cursor = head->next, *tmp;

    head->next = NULL;
    while (cursor) {
        tmp = cursor->next;
        cursor->next = head->next;
        head->next = cursor;
        cursor = tmp;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768834.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号