当前位置: 首页 > news >正文

百度网站大全首页中国外贸导航网

百度网站大全首页,中国外贸导航网,wordpress主题 自定义字段,python的网站开发源码目录 第一步:问题本质分析 第二步:指针的角色定义 第三步:核心操作逻辑(滑动指针) 第四步:循环直到一个链表为空 第五步:代码实现 给定两个有序的单链表(升序)&…

目录

第一步:问题本质分析

第二步:指针的角色定义

第三步:核心操作逻辑(滑动指针)

第四步:循环直到一个链表为空

第五步:代码实现


给定两个有序的单链表(升序),我们要把它们合并成一个新的有序链表,并且不新建节点,只复用原有节点。

数据结构:数组:合并数组(Merging Arrays)-CSDN博客

举个例子(升序合并):

List A: 1 → 3 → 5 → NULL  
List B: 2 → 4 → 6 → NULL

合并后:

Merged: 1 → 2 → 3 → 4 → 5 → 6 → NULL

第一步:问题本质分析

我们面对的是两个“有序序列”,本质是:

你要像“拉拉链”一样,从两个链表中选择当前最小的节点,接到结果链表中,然后往前推进那个节点

这其实就像是两个队列合并排序(归并排序 merge 步骤),但数据结构是链表。

❓问题1:我们能做的“最小动作”是什么?

答:我们能做的最小动作是:

比较 a1->datab1->data,谁小,谁应该排在合并链表最前面。

这是第一性操作单位,我们只能通过一次比较和一次 ->next 访问,来获取有限信息。

❓问题2:为什么我们需要一个“结果链表”?

你想最终有一个“新链表”,连接所有节点。但这些节点已经存在了,我们不用重新创建节点(否则浪费空间)。

所以我们只需要做一件事:

“连接指针”,让所有节点按顺序接起来。


第二步:指针的角色定义

❓问题3:我们能否只用一个变量维护合并链表?

设想我们一开始选定了合并链表的“第一个节点”。
比如第一次比较 a1b1,发现 a1->data < b1->data,我们就让:

merged_head = a1;

但这还不够,我们还需要维护一个指针:

→ 当前合并链表的最后一个节点(即尾指针)

否则我们就无法追加下一个节点。

推导到此,我们需要两个“操作级”指针:

  1. merged_head:记录整个合并链表的开头

  2. merged_tail:指向合并链表的最后一个节点,方便追加

几个基本指针变量来进行这项操作:

名称用途
first指向第一个链表当前节点
second指向第二个链表当前节点
merged_tail当前合并链表最后一个节点(尾指针)
merged_head指向合并后链表的头节点(第一次选中谁就赋值)

第三步:核心操作逻辑(滑动指针)

每一步我们都比较 first->datasecond->data

  • 取小的那个节点

  • 把它接到 merged_tail->next

  • 然后移动那个指针前进一步,否则下一轮还是同一个元素,这叫“消费当前节点”。

if (A->data < B->data) {merged_tail->next = A;A = A->next;
} else {merged_tail->next = B;B = B->next;
}
merged_tail = merged_tail->next;

  图解过程

A → [1] → [3] → [5]
B → [2] → [4] → [6]

执行顺序如下:

步骤比较选择Merged 链表
11 vs 21[1]
23 vs 22[1] → [2]
33 vs 43[1] → [2] → [3]
45 vs 44[1] → [2] → [3] → [4]
55 vs 65...
6NULL vs 66...

第四步:循环直到一个链表为空

❓问题4:谁是第一个节点?我们要不要特殊处理第一次?

第一次没有任何节点被加入,所以我们不能这样:

merged_tail->next = ...

因为 merged_tail 还没有定义,所以第一次我们要单独处理:

  • 第一次比较 A 和 B,谁小,谁就成为 merged_head

  • 也让 merged_tail 指向它,开始构建过程

这个操作写成:

if (A->data < B->data) {merged_head = A;merged_tail = A;A = A->next;
} else {merged_head = B;merged_tail = B;B = B->next;
}

为什么后面不需要再判断 merged_head?

因为我们一旦初始化了 merged_headmerged_tail,剩下的逻辑就完全一样了。

当任意一个链表先结束(指针变成 NULL),另一个链表的剩余部分就是升序链表,可以直接接在合并链表尾部

if (A == NULL)merged_tail->next = B;
elsemerged_tail->next = A;
操作本质解释
合并操作从两个有序链表中每次选最小的那个
指针处理用 tail 指针维护“已合并链表的结尾”
尾部接上最后只剩一个非空链表,直接接上
内存节省所有节点都是原链表复用,无需新建节点

第五步:代码实现

struct Node* merge(struct Node* A, struct Node* B) {struct Node* merged_head = NULL;struct Node* merged_tail = NULL;// Step 1: 处理第一个节点,决定 merged_headif (A == NULL) return B;if (B == NULL) return A;if (A->data < B->data) {merged_head = A;merged_tail = A;A = A->next;} else {merged_head = B;merged_tail = B;B = B->next;}// Step 2: 一边比较一边构建合并链表while (A != NULL && B != NULL) {if (A->data < B->data) {merged_tail->next = A;merged_tail = A;A = A->next;} else {merged_tail->next = B;merged_tail = B;B = B->next;}}// Step 3: 谁没处理完就接上谁if (A != NULL)merged_tail->next = A;elsemerged_tail->next = B;return merged_head;
}

时间与空间复杂度分析

方面分析
时间复杂度O(n + m),n 和 m 分别是两个链表的长度
空间复杂度O(1),因为不新建节点,只操作指针
http://www.dtcms.com/a/527584.html

相关文章:

  • 电脑网站开发学习网站开发技术的历史
  • 响应式网站方案个人网站建立策划书前言
  • 网站设计考虑因素高端品牌网站建设电商网站设计
  • 做一公司网站网站开设作风建设专栏
  • 做网站购买服务器吗h56wcom什么网站
  • 站长平台高端网页建设
  • 最新网站建设语言网站列表页怎么做的
  • 大学网站建设目标网线制作线序
  • 厦门php商城网站建设手机哪个网站好
  • 新闻标题做的好的网站wordpress微信分享记录
  • 免费推广网站入口2023网站定制开发收费标准是多少
  • 个人物流网站建设方案大理悦花轩客栈在哪些网站做推广
  • 网站添加关键词自建站 外贸
  • 百度云做网站息壤服务器网站打不开
  • 如何让网站做成移动版安徽网站排名优化公司
  • 网站电脑培训班办公软件培训类网站模板
  • 快速建企业网站wordpress换模版
  • 房地产网站策划模板网站的缺点
  • 汉中 网站建设wordpress个人展示
  • 陕西网站建设宣传方案如何查看网站空间商
  • 宿迁做网站需要多少钱wordpress网站收录
  • 固定ip做网站路由设置百达翡丽手表网站
  • wordpress卡密网站源码hao123主页
  • 做网站的荣誉证书wordpress 自带相册
  • 网站建设saaswordpress聚合广告平台
  • 网站建设标书样本公司后台的网站代理维护更新
  • .net开发的网站有哪些永久免费手机网站建设的好处
  • 中药网站模板有个专门做装修的网站
  • 安徽湖滨建设集团网站app我的页面设计
  • 重庆网站建设与网络推广做电影网站需要注意事项