合并两个非降序链表(C语言)

【问题描述】
两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。

【输入形式】
第一行为第一个链表的各结点值,以空格分隔。
第二行为第二个链表的各结点值,以空格分隔。

【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。

【样例输入】
4 7 10 34
1 4 6 29 34 34 52

【样例输出】
1 4 6 7 10 29 34 52

【评分标准】
要使用链表实现,否则不能得分。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;
typedef struct LNode{
    ElemType value;
    struct LNode *next;
}LNode,*LinkList;

Status InitList_L(LinkList *L){
    (*L)=(LinkList)malloc(sizeof(LNode));
    if(!(*L))
        exit(OVERFLOW);
    (*L)->next=NULL;

    return OK;
}

Status CreateList_HL(LinkList *L){
    ElemType tmp;
    LinkList q,p=(*L);
    while(scanf("%d",&tmp)){
        q=(LinkList)malloc(sizeof(LNode));
        if(!q)
            exit(OVERFLOW);
        q->value=tmp;
        q->next=p->next;
        p->next=q;
        p=p->next;
        if(getchar()!=' ')   {q->next=NULL;break;}
    }

    return OK;
}

Status MergeList_L(LinkList L1,LinkList L2,LinkList *L3){
    LinkList p1=L1->next;
    LinkList p2=L2->next;
    LinkList p3=(*L3);
    LinkList q=NULL;
    while(p1&&p2){
        if(p1->value<=p2->value){
            if(q==NULL||p1->value>q->value){
                q=(LinkList)malloc(sizeof(LNode));
                q->value=p1->value;
                q->next=p1->next;
                p3->next=q;
                p3=p3->next;
            }
            p1=p1->next;
        }
        else{
            if(q==NULL||p2->value>q->value){
                q=(LinkList)malloc(sizeof(LNode));
                q->value=p2->value;
                q->next=p2->next;
                p3->next=q;
                p3=p3->next;
            }
            p2=p2->next;
        }
    }
    if(!p1){
        while(p2){
            if(p2->value>q->value){
                q->next=p2;
                q=q->next;
            }
            p2=p2->next;
        }
        q->next=NULL;
    }
    else{
        while(p1){
            if(p1->value>q->value){
                q->next=p1;
                q=q->next;
            }
            p1=p1->next;
        }
        q->next=NULL;
    }

    return OK;
}

Status PrintList_L(LinkList L){
    LinkList p=L->next;
    while(p){
        printf("%d ",p->value);
        p=p->next;
    }
    printf("\n");

    return OK;
}

int main(){
    LinkList L1,L2,L3;
    InitList_L(&L1);
    InitList_L(&L2);
    InitList_L(&L3);
    CreateList_HL(&L1);
    CreateList_HL(&L2);
    MergeList_L(L1,L2,&L3);
    PrintList_L(L3);
    return 0;
}

  • 16
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
下面是用 C 语言实现将两个升序链表合并为一个降序链表的示例代码: ```c #include<stdio.h> #include<stdlib.h> struct ListNode { int val; struct ListNode* next; }; struct ListNode* mergeLists(struct ListNode* l1, struct ListNode* l2) { if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; } struct ListNode* merged_head; if (l1->val < l2->val) { merged_head = l1; merged_head->next = mergeLists(l1->next, l2); } else { merged_head = l2; merged_head->next = mergeLists(l1, l2->next); } return merged_head; } void printList(struct ListNode* head) { struct ListNode* current = head; while (current != NULL) { printf("%d ", current->val); current = current->next; } printf("\n"); } int main() { // 创建链表1:1 -> 3 -> 5 struct ListNode* l1 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* l1_1 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* l1_2 = (struct ListNode*)malloc(sizeof(struct ListNode)); l1->val = 1; l1_1->val = 3; l1_2->val = 5; l1->next = l1_1; l1_1->next = l1_2; l1_2->next = NULL; // 创建链表2:2 -> 4 -> 6 struct ListNode* l2 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* l2_1 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* l2_2 = (struct ListNode*)malloc(sizeof(struct ListNode)); l2->val = 2; l2_1->val = 4; l2_2->val = 6; l2->next = l2_1; l2_1->next = l2_2; l2_2->next = NULL; // 合并链表并打印结果 struct ListNode* merged = mergeLists(l1, l2); printList(merged); // 释放内存 free(l1); free(l1_1); free(l1_2); free(l2); free(l2_1); free(l2_2); return 0; } ``` 在这个示例中,我们首先定义了一个 `ListNode` 结构体来表示链表的节点。然后,实现了 `mergeLists` 函数来完成链表合并。最后,在 `main` 函数中创建了两个升序链表,调用 `mergeLists` 函数进行合并,并打印结果。 请注意,在实际使用时,应该根据需要自行定义释放链表内存的函数,以避免内存泄漏。这里只是简单示例,没有包含完整的内存释放操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦曲花无赖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值