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日

悬赏问题

  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路