viency13 2023-03-10 11:34 采纳率: 68.8%
浏览 33
已结题

运行超时,是main函数里的循环调用了太多次函数吗

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
代码长度限制
16 KB
时间限制
1500 ms
内存限制
128 MB


#include <iostream>
using namespace std;
typedef struct Lnode
{
    int data;
    struct Lnode *next;
} Lnode, *Linklist;

int creat(Linklist &L)
{
    L = new Lnode;
    L->next = NULL;
    Linklist p, q = L;
    while (1)
    {
        p = new Lnode;
        cin >> p->data;
        if (p->data == -1)
        {
            return 0;
        }
        p->next = NULL;
        q->next = p;
        q = p;
    }
}

void cmp(Linklist &L, int e)
{
    Linklist p = L;
    if ( p->next == NULL ||e < p->next->data )
    {
        Linklist q = new Lnode;
        q->data = e;
        q->next = p->next;
        p->next = q;
    }
    else
    {
        while ( p->next != NULL && e >= p->next->data)
        {
            p = p->next;
        }
        Linklist q = new Lnode;
        q->data = e;
        q->next = p->next;
        p->next = q;
    }
}
void Print(Linklist L)
{
    Linklist p = L->next;
    if ( p == NULL )
    {
        cout << "NULL";
    }
    while (p != NULL)
    {
        cout << p->data;
        if (p->next != NULL)
        {
            cout << " ";
        }
        p = p->next;
    }
}
int main()
{
    int t;
    Linklist L;
    creat(L);
    while (1)
    {
        cin >> t;
        if (t == -1)
        {
            break;
        }
        cmp(L, t);
    }
    Print(L);
    return 0;
}
 
  • 写回答

4条回答 默认 最新

  • ksgpjhqf 2023-03-10 12:37
    关注

    有序链表合并比重新排序效率高

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Lnode {
        int val;
        struct Lnode *next;
    } Lnode;
    
    void input(Lnode *p) {
        int v;
        while (scanf("%d", &v), v != -1) {
            p->next = (Lnode*)malloc(sizeof(Lnode));
            p = p->next;
            p->val = v;
        }
        p->next = NULL;
    }
    
    int compare(Lnode *p, Lnode *q) {
        return p->val < q->val;
    }
    
    void pb(Lnode **t, Lnode **p) {
        (*t)->next = *p;
        *t = *p;
        *p = (*p)->next;
    }
    
    void merge(Lnode *h1, Lnode *h2) {
        Lnode h3, *p, *q, *t = &h3;
        for (p = h1->next, q = h2->next; p && q;) {
            if (compare(p, q)) {
                pb(&t, &p);
            } else {
                pb(&t, &q);
            }
        }
        while (p) {
            pb(&t, &p);
        }
        while (q) {
            pb(&t, &q);
        }
        t->next = NULL;
        h1->next = h3.next;
    }
    
    void output(Lnode *h) {
        h = h->next;
        if (h) {
            while (h->next) {
                printf("%d ", h->val);
                h = h->next;
            }
            printf("%d", h->val);
        }
    }
    
    int main() {
        Lnode h1, h2;
        input(&h1);
        input(&h2);
        merge(&h1, &h2);
        output(&h1);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题