链表合并
来源:互联网 发布:c语言中竖线 编辑:程序博客网 时间:2024/06/07 03:38
题目: 输入两个递增排序的链表,要求把两个链表和并成一个链表并且使得新链表也是递增排序的。
分析:
1. 假设两个链表如下所示
2. 要合并两个链表,可以利用归并排序的合并思想,从头枚举两个链表,判断两个指针指向的两个结点的值关系。
(1)初始化两个指针p1,p2分别指向两个链表的头结点,合并之后新的链表头结点肯定是两个链表中值较小的那个
(2)每一次比较两个指针指向的结点值的大小,如果p1较小则把p1指向结点加入新链表,否则加入p2指向的结点。直到有一个链表为空,然后把剩下的所有结点全部加入新链表即可
3. 代码(归并排序思想)
- //链表结点
- struct ListNode{
- int value;
- ListNode *nextNode;
- };
- //合并两个链表
- ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
- //如果第一个链表是空链表返回链表2头结点
- if(headOne == NULL){
- return headTwo;
- }
- //如果第二个链表是空链表返回链表1头结点
- if(headTwo == NULL){
- return headOne;
- }
- //设定两个指针分别指向两个链表头结点
- ListNode *p1 = headOne;
- ListNode *p2 = headTwo;
- ListNode *newHeadNode = NULL;
- //判断哪一个是新的头结点
- if((p1->value) <= (p2->value)){
- newHeadNode = p1;
- p1 = p1->nextNode;
- }
- else{
- newHeadNode = p2;
- p2 = p2->nextNode;
- }
- //设置一个指向新链表的指针
- ListNode *curNode = newHeadNode;
- //合并两个链表
- while((p1 != NULL) && (p2 != NULL)){
- if((p1->value) <= (p2->value)){
- curNode->nextNode = p1;
- curNode = curNode->nextNode;
- p1 = p1->nextNode;
- }
- else{
- curNode->nextNode = p2;
- curNode = curNode->nextNode;
- p2 = p2->nextNode;
- }
- }
- //把剩下没有加入的全部加入新链表
- //最多只会有一个链表不为空
- while((p1 != NULL)){
- curNode->nextNode = p1;
- curNode = curNode->nextNode;
- p1 = p1->nextNode;
- }
- while(p2 != NULL){
- curNode->nextNode = p2;
- curNode = curNode->nextNode;
- p2 = p2->nextNode;
- }
- //返回新的链表结点
- return newHeadNode;
- }
递归代码,更加简洁
- struct ListNode{
- int value;
- ListNode *nextNode;
- };
- //合并两个链表
- ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
- //链表1为空
- if(headOne == NULL){
- return headTwo;
- }
- //链表2为空
- if(headTwo == NULL){
- return headOne;
- }
- //新建一个结点
- ListNode *newNode = NULL;
- if((headOne->value) <= (headTwo->value)){
- newNode = headOne;
- newNode->nextNode = MergeList(headOne->nextNode, headTwo);
- }
- else{
- newNode = headTwo;
- newNode->nextNode = MergeList(headOne, headTwo->nextNode);
- }
- return newNode;
- }
0 0
- 有序链表合并&有序数组合并
- 有序链表合并
- C++合并链表
- 合并链表操作
- 合并两个链表
- 合并有序链表
- 链表的合并
- 合并链表
- 链表合并算法
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 有序链表合并
- 链表合并
- 合并有序链表
- 合并链表
- 链表合并算法
- 合并有序链表
- WEB前端优化
- 进程和线程的区别
- MySQL 在大型网站的应用架构演变
- 浅谈 qmake 之 pro、pri、prf、prl文件
- 我的 Web 前端开发路
- 链表合并
- 小米步枪风格两种思路的双色球
- Linux下/proc目录简介
- VC包含目录、附加依赖项、库目录及具体设置
- maven环境快速搭建
- 解决centos虚拟机无法获取ipv4地址的问题
- 【Jobs】阿里算法实习生笔试——墙之间积水体积
- AAC编码规格
- Linux 客户机操作系统中安装 VMware Tools