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

C++面试(10)---合并两个排序的链表

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然递增有序。
你可以选择不修改原链表,也可以就地合并(视题目要求)。

示例:

输入:
链表1: 1 -> 2 -> 4
链表2: 1 -> 3 -> 4

输出:
合并后链表: 1 -> 1 -> 2 -> 3 -> 4 -> 4

解法思路:双指针归并法

这个题目是链表操作的经典问题,和“归并排序”中合并两个有序数组非常类似。
思路总结:

  • 使用两个指针 l1 和 l2 分别遍历两个链表;
  • 创建一个虚拟头节点 dummy,便于统一处理;
  • 创建一个指针 cur 跟随构建结果链表;
  • 每次比较 l1->val 和 l2->val,把较小的节点接到 cur->next,然后移动相应指针;
  • 当其中一个链表为空时,直接将另一个链表剩余部分接上即可;
  • 最后返回 dummy.next 就是合并后的链表头节点。

C++ 实现代码


// 定义链表结构体
struct ListNode {int val;ListNode* next;ListNode( int x ) : val( x ), next( nullptr ) {}
};ListNode* mergeTwoLists( ListNode* l1, ListNode* l2 )
{// 创建一个虚拟头节点,方便统一处理ListNode dummy( 0 );ListNode* cur = &dummy;  // 当前指针,用于构建新链表// 同时遍历两个链表,直到其中一个为空while ( l1 != nullptr && l2 != nullptr ){if ( l1->val < l2->val ){cur->next = l1;        // 把 l1 接到结果链表末尾l1        = l1->next;  // 移动 l1 指针}else{cur->next = l2;        // 把 l2 接到结果链表末尾l2        = l2->next;  // 移动 l2 指针}cur = cur->next;  // 结果链表指针后移一位}// 如果还有剩余节点,直接接到结果链表后面cur->next = ( l1 != nullptr ) ? l1 : l2;// 返回合并后的链表头节点(即 dummy 的下一个节点)return dummy.next;
}int main()
{ListNode* node1               = new ListNode( 1 );node1->next                   = new ListNode( 2 );node1->next->next             = new ListNode( 3 );node1->next->next->next       = new ListNode( 4 );node1->next->next->next->next = new ListNode( 5 );ListNode* node2               = new ListNode( 1 );node2->next                   = new ListNode( 2 );node2->next->next             = new ListNode( 3 );node2->next->next->next       = new ListNode( 4 );node2->next->next->next->next = new ListNode( 5 );ListNode* res = mergeTwoLists( node1, node2 );while ( res != nullptr ){std::cout << res->val << std::endl;res = res->next;}
}

输出:

1
1
2
2
3
3
4
4
5
5
http://www.xdnf.cn/news/13864.html

相关文章:

  • 历史交易数据涨跌分级
  • 《信号与系统》第 9 章 拉普拉斯变换
  • Chainlink VRF 深度解析与实战
  • 进阶四 带记忆功能的000-255 计数器
  • 基于Python的热门微博数据可视化分析-Flask+Vue
  • 蚂蚁集团法人变更:韩歆毅接任,公司治理的正常安排
  • 第17篇:数据库中间件的弹性伸缩与容量规划实战
  • MySQL库操作
  • 升级openssl后无法使用cmake和curl的解决方法
  • Logic Error: 如何识别和修复逻辑错误
  • C++题解 P4933 2.间谍原题:
  • 斗式提升机的负载特性对变频驱动的要求
  • 三星MZQL2960HCJR-00BAL高性能固态硬盘控制器SSD云计算和高端存储专用 电子元器件解析
  • 深刻理解深度学习的注意力机制Attention
  • Python 轻量化环境管理利器 UV 入门与 Windows 下安装实战
  • liquibase 集成 pt-online-schema-change
  • 穿越时空的刀剑之旅:走进VR刀剑博物馆​
  • python打卡day53
  • java中LinkedList和ArrayList的区别和联系?
  • python第51天
  • React Native【实战范例】网格导航 FlatList
  • oceanbase导出导入数据csv
  • 【Python教程】CentOS系统下Miniconda3安装与Python项目后台运行全攻略
  • visual studio2019+vcpkg管理第三方库
  • Vastbase的常用操作
  • 表格对比工具推荐,快速比对Excel文件
  • 用AI思维重塑人生:像训练神经网络一样优化自己
  • 图数据库如何构筑 Web3 风控防线 | 聚焦批量注册与链上盗转
  • Node.js 检测视频链接是否可以播放(批量检测)
  • C++题解 P1525 Cantor表