03-F. DS单链表--合并

实验03-顺序表-

题目描述
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序

int LL_merge(ListNode *La, ListNode *Lb)

输入
第1行先输入n表示有n个数据,接着输入n个数据

第2行先输入m表示有M个数据,接着输入m个数据


输出
输出合并后的单链表数据,数据之间用空格隔开

输入样例
3 11 33 55
4 22 44 66 88

11 22 33 44 55 66 88

(格式:最后一个数据仍然带空格

#include<iostream>
using namespace std;

typedef struct node
{
   
   
 int data;
 struct node *next;
}node;

void create(node *H,int n)
{
   
   
    H->next=NULL
单位 浙江大学 对于顺序存储的长度为N的线性表,删除第一个元素和插入最后一个元素的时间复杂度分别对应为O(1)和O(N)。 T F 分数 1 作者 徐婉珍 单位 广东东软学院 (neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。 T F 分数 1 作者 徐婉珍 单位 广东东软学院 (neuDS)在线性表的顺序存储结构中可实现快速的随机存取,而在链式存储结构中则只能进行顺序存取。 T F 分数 1 作者 徐婉珍 单位 广东东软学院 (neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 顺序存储的线性表可以随机存取。 T F 分数 1 作者 高磊 单位 西南石油大学 顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。 T F 分数 1 作者 ZXM 单位 西南石油大学 在N个结点的顺序表中访问第i(1<=i<=N)个结点和求第i(2<=i<=N)个结点直接前驱的算法时间复杂度均为O(1)。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 线性表采用链式存储表示时,所有结点之间的存储单元地址可以连续也可以不连续。 T F 分数 1 作者 干红华 单位 浙江大学 将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 在具有头结点的链式存储结构中,头指针指向链表中的第一个元素结点。 T F 分数 1 作者 DS课程组 单位 浙江大学 在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 T F 分数 1 作者 陈越 单位 浙江大学 若用链表来表示一个线性表,则表中元素的地址一定是连续的。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 循环链表不是线性表。 T F 分数 1 作者 王俊玲 单位 集美大学 下列函数试图求链式存储的线性表的表长,是否正确? int Length ( List *PtrL ) { List *p = PtrL; int j = 0; while ( p ) { p++; j++; } return j; } T F 分数 1 作者 徐婉珍 单位 广东东软学院 (neuDS)线性表的长度是指线性表所占用的存储空间的大小。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 线性表中每个元素都有一个直接前趋和一个直接后继。 T F 分数 1 作者 徐婉珍 单位 广东东软学院 (neuDS)线性表的逻辑顺序和存储顺序总是一致的。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 线性表的插入、删除总是伴随着大量数据的移动。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 线性表中的所有数据元素的数据类型必须相同。 T F 分数 1 作者 陈越 单位 浙江大学 线性表是表示多对一关系的数据结构。 T F 分数 1 作者 李廷元 单位 中国民用航空飞行学院 带头结点的单循环链表中,任一结点的后继结点的指针域均不空。 T F 分数 1 作者 DS课程组 单位 临沂大学 单链表中引入头结点会使结点插入操作的时间复杂度降为常数阶。 T F 分数 1 作者 杨 单位 浙大城市学院 循环链表可以做到从任一结点出发,访问到链表的全部结点。 T F 分数 1 作者 高磊 单位 西南石油大学 在带头结点的非空单链表中,头结点的存储位置由前驱结点指示。 T F 分数 1 作者 高磊 单位 西南石油大学 在双向链表中,可以从当前结点出发访问到任何一个结点。 T F
最新发布
09-24
数据结构单链表合并有多种实现方法,以下为你详细介绍: ### 方法一:通过比较元素大小合并 此方法是比较两个链表当前元素大小,将较小元素依次连接到新链表,最后处理剩余元素。 ```c struct node *merge(struct node *La, struct node *Lb) { struct node *pa, *pb, *pc; pa = La->next; // pa 指向表 La 的首结点 pb = Lb->next; // pb 指向表 Lb 的首结点 pc = La; // 使用表 La 的头结点,pc 为尾指针 free(Lb); // 释放 表Lb的头结点 // 比较 Pa 和 Pb 指向结点的数据域值大小 while(pa && pb) { // 表 La,Lb 均有结点 if(pa->data <= pb->data) { // 取表La 的一个结点 pc->next = pa; // 插在表Lc的尾结点之后 pc = pa; // 变为表Lc 新的尾结点 pa = pa->next; // 移向表La 下一个结点 } else { // 取表Lb 的一个结点 pc->next = pb; // 插在表Lc的尾结点之后 pc = pb; // 变为表Lc 新的尾结点 pb = pb->next; // 移向表Lb 下一个结点 } } if(pa) pc->next = pa; // 插入表La的剩余段(如果Lb已遍历) else pc->next = pb; // 插入表Lb的剩余段 return La; } ``` 这种方法的核心在于利用三个指针`pa`、`pb`、`pc`分别扫描两个原始链表和构建新链表,每次比较两个链表当前元素大小,将较小元素连接到新链表,最后把剩余元素直接连接到新链表末尾[^3]。 ### 方法二:另一种比较元素大小合并方式 该方法同样比较元素大小,但使用`malloc`创建新头结点,过程与上一种类似。 ```c typedef struct ListNode { int val; struct ListNode *next; } ListNode; typedef ListNode* PNodeList; PNodeList mergeTwoList(PNodeList l1, PNodeList l2) { if (l1 == NULL) return l2; if (l2 == NULL) return l1; PNodeList head = NULL, tail = NULL; head = tail = (PNodeList)malloc(sizeof(ListNode)); while (l1 && l2) { if (l1->val < l2->val) { tail->next = l1; tail = tail->next; l1 = l1->next; } else { tail->next = l2; tail = tail->next; l2 = l2->next; } } if (l1) { tail->next = l1; } if (l2) { tail->next = l2; } return head->next; } ``` 此方法先创建新头结点,然后在循环中比较`l1`和`l2`当前元素大小,将较小元素连接到新链表,最后处理剩余元素,返回合并链表的首结点[^2]。 ### 方法三:循环单链表合并 该方法适用于循环单链表,通过找到第一个链表尾结点,连接第二个链表首结点,再找到第二个链表尾结点构成循环。 ```c typedef struct LinkList { int data; struct LinkList *next; } LinkList; void Merge(LinkList* ha, LinkList* hb, LinkList* hc) { LinkList* p = ha->next; hc = ha; while (p->next != ha) { p = p->next; // 找到尾结点 } p->next = hb->next; while (p->next != hb) { p = p->next; // 找到hb的尾结点 } p->next = hc; free(hb); // 释放hb单链表的头结点 } ``` 这种方法针对循环单链表,先找到第一个链表尾结点,将其`next`指向第二个链表首结点,再找到第二个链表尾结点,使其`next`指向第一个链表头结点,最后释放第二个链表头结点[^4]。 ### 展示合并链表 以下是展示合并链表的代码: ```c #include <iostream> using namespace std; typedef struct List { int data; struct List *next; } List; void showList(List *head) { List *p; p = head->next; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } ``` 此代码通过遍历链表,依次输出每个结点的数据,可用于验证合并结果[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值