scau 8577 合并顺序表

//浅浅复习一下

       顺序表的基本操作我就不讲啦,这道题的话,就用两个指针,分别指向List A和List B,比较当前两个值的大小,把小的拿出来放进List C中,指针后移(那个指向大的指针不用动),一直循环,当List A或List B其中一个到达表尾时,就不用再比较了,把没到达表尾的那个顺序表依次取值放入List C即可。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define ElemType int
using namespace std;

typedef struct
{
    int *elem;//存储空间的基地址
    int length;//项的个数
}SqList;

int InitList(SqList &L)//线性表初始化
{
    L.elem=new int[MAXSIZE];//分配一个MAXSIZE的存储空间
    if(!L.elem)//分配失败
        return ERROR;
    L.length=0;//空表长度为0
    return OK;
}

int GetElem(SqList &L,int i,int &e)//取值
{
    if(i<1 || i>L.length)//i值不合法
        return ERROR;
    e=L.elem[i];
    return OK;
}

int LocateElem(SqList &L,int e)//查找
{
    for(int i=1;i<=L.length;i++)//我的数组从1开始
    {
        if(L.elem[i]==e)
            return i;
    }
    return 0;
}

int Getlength(SqList &L)//取表长
{
    return L.length;
}
int InsertList(SqList &L,int i,int e)//在第i个前插入,那么插入的这个就成了第i个
{
    if(i<1 || i>L.length+1)//i值不合法
        return ERROR;
    if(L.length==MAXSIZE)//超过最大存储空间
        return ERROR;
    for(int j=L.length+1;j>i;j--)
    {
        L.elem[j]=L.elem[j-1];//往后移
    }
    L.elem[i]=e;//赋值插入
    L.length++;//表长+1
    return OK;
}

int DeleteList(SqList &L,int i,int &e)//删除
{
    if(i<1 || i>L.length)//i值不合法
        return ERROR;
    e=L.elem[i];//返回第i个
    for(int j=i;j<L.length;j++)
    {
        L.elem[j]=L.elem[j+1];//往前移
    }
    L.length--;//表长减一
    return OK;
}
void hebing(SqList &LA,SqList &LB,SqList &LC)
{
    std::ios::sync_with_stdio(false);
    int i=1,j=1,k=1;
    int LA_len,LB_len;
    LA_len=Getlength(LA);//取表长
    LB_len=Getlength(LB);
    int ai,bj;
    while(i<=LA_len && j<=LB_len)//如果LA和LB均未到达表尾
    {
        ai=LA.elem[i],bj=LB.elem[j];//取值
        if(ai<=bj)//如果ai比bj小
        {
            InsertList(LC,k++,ai);//插入到LC中
            i++;//i+1
        }
        else
        {
            InsertList(LC,k++,bj);
            j++;
        }
    }
    while(i>LA_len && j<=LB_len)//当LA到达了表尾,而LB还没到表尾时
    {
        //bj=GetElem(LB,j,bj);
        bj=LB.elem[j];
        InsertList(LC,k++,bj);
        j++;
    }
    while(j>LB_len && i<=LA_len)
    {
        //ai=GetElem(LA,i,ai);
        ai=LA.elem[i];
        InsertList(LC,k++,ai);
        i++;
    }
    cout << "List C:";
    for(int m=1;m<k;m++)
    {
        cout << LC.elem[m] << ' ';
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    SqList LA,LB,LC;
    InitList(LA);
    InitList(LB);
    int n,m;
    int a,b;
    cin >> n;
    int ai,bj;
    for(a=1;a<=n;a++)
    {
        cin >> ai;
        InsertList(LA,a,ai);
    }
    cout << "List A:";
    for(a=1;a<=n;a++)
    {
        cout << LA.elem[a]<<' ';
    }
    cout << endl;
    cin >> m;
    for(b=1;b<=m;b++)
    {
        cin >> bj;
        InsertList(LB,b,bj);
    }
    cout<< "List B:" ;
    for(b=1;b<=m;b++)
    {
        cout << LB.elem[b]<<' ';
    }
    cout << endl;
    InitList(LC);
    hebing(LA,LB,LC);
    return 0;
}

### SCAU 链表有序合并算法实现 在讨论链表有序合并之前,先了解单向链表的基本结构。单向链表是一种线性数据结构,在这种结构中,节点通过指针链接在一起[^1]。 对于两个已排序的单向链表`L1`和`L2`来说,要将它们合并成一个新的升序排列的链表可以采用迭代的方法来完成这一操作。具体做法如下: 创建一个哨兵节点作为新链表头部,并维护当前处理位置的一个游标变量`cur`指向该哨兵节点;接着比较`L1`与`L2`头结点的数据域大小关系,较小者被追加到由`cur`所指示的位置之后并更新对应原链表以及`cur`指针直至某一方遍历结束;最后如果存在剩余未访问过的部分,则直接将其连接至新的有序链表末端即可[^2]。 以下是Python语言下的简单实现方式: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode: sentinel = cur = ListNode() while l1 and l2: if l1.val < l2.val: cur.next = l1 l1 = l1.next else: cur.next = l2 l2 = l2.next cur = cur.next cur.next = l1 or l2 return sentinel.next ``` 此方法的时间复杂度为O(n+m),其中n,m分别为输入两列表长度之和。空间开销主要取决于递归调用栈深度或者是额外使用的辅助存储单元数量,在这里由于采用了迭代而非递归来解决问题所以实际运行过程中仅需常数级别的额外内存支持即能达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值