1.题目要求

这是一道求职面试时经常要求手写或者机试的经典题目。

已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。结果链表要包含head1和head2的所有节点,即使节点值相同。

注意:不能开辟新空间来存储合并后的链表。如果第一次做该题,很容易会想到使用新链表来存储合并后的有序链表。虽然可以如此实现,但是不符合常规解法和面试官的要求。

2.非递归实现

算法过程:

输入:两个有序的单链表head1与head2;

输出:合并后的有序单链表mergeHead;

算法描述:

(1)如果head1或head2为空链表,则直接返回另外一个链表;

(2)选择head1与head2链表当前节点值较小的节点,挂接到后并后的链表mergeHead;

(3)重复步骤2,直到链表head1或者head2遍历完成,未遍历完的链表,直接挂接到mergeHead的尾节点。

具体实现如下:

#include

#include

using namespace std;

struct ListNode

{

int value;

ListNode* next;

ListNode() {value=0;next=NULL;}

ListNode(int value,ListNode* next = NULL):value(value),next(next){}

};

//@brief:非递归实现两个有序单链表

//@注意:两个链表需要从小到大顺序排列

ListNode* mergeOrderedLinkedList(ListNode* head1,ListNode* head2)

{

if (head1 == NULL)

{

return head2;

}

else if(head2 == NULL)

{

return head1;

}

ListNode* mergeHead = NULL;

if (head1->valuevalue)

{

mergeHead=head1;

head1=head1->next;

}

else

{

mergeHead = head2;

head2 = head2->next;

}

ListNode* tmpNode = mergeHead;

while(head1&&head2)

{

if(head1->valuevalue)

{

mergeHead->next = head1;

head1 = head1->next;

}

else

{

mergeHead->next = head2;

head2 = head2->next;

}

mergeHead = mergeHead->next;

}

if (head1)

{

mergeHead->next = head1;

}

if (head2)

{

mergeHead->next = head2;

}

return tmpNode;

}

//打印链表

void printLinkedList(ListNode* head)

{

while(head)

{

cout<value<

head=head->next;

}

cout<

}

int main(int argc,char* argv[])

{

ListNode* head1=NULL,*curList1=NULL,*head2=NULL,*curList2=NULL;

string strIn;

int value;

cout<

getline(cin,strIn);

stringstream ss(strIn);

cout<

while(ss>>value) //从string中按照空格读取int

{

ListNode* newNode1=new ListNode;

newNode1->value=value;

if(head1==NULL && curList1==NULL)

{

head1=newNode1;

curList1=newNode1;

}

else

{

curList1->next=newNode1;

curList1=curList1->next;

}

}

cout<

getline(cin,strIn);

ss.clear(); //清空状态

ss.str(""); //清空内容

ss<

cout<

while(ss>>value) //从string中按照空格读取int

{

ListNode* newNode2=new ListNode;

newNode2->value=value;

if(head2==NULL && curList2==NULL)

{

head2=newNode2;

curList2=newNode2;

}

else

{

curList2->next=newNode2;

curList2=curList2->next;

}

}

//合并两个有序链表

ListNode* mergeHead=mergeOrderedLinkedList(head1,head2);

//打印链表

cout<

printLinkedList(mergeHead);

}

运行程序,输出结果:

从小到大顺序输入链表1:

1 2 3 5

ss0 strIn:1 2 3 5

从小到大顺序输入链表2:

3 4 5 6 7 8

ss1 strIn:3 4 5 6 7 8

合并后链表:

1 2 3 3 4 5 5 6 7 8

3.递归实现

从上面合并两个有序链表的步骤中可以看出,每次合并的步骤(2)都是一样的,由此我们想到了递归。具体实现如下:

//@brief:递归实现两个有序单链表

//@注意:两个链表需要从小到大顺序排列

ListNode* mergeOrderedLinkedListRecursion(ListNode* head1,ListNode* head2)

{

if(head1 == NULL)

{

return head2;

}

else if(head2 == NULL)

{

return head1;

}

ListNode* mergeHead = NULL;

if(head1->valuevalue)

{

mergeHead=head1;

mergeHead->next=mergeOrderedLinkedListRecursion(head1->next,head2);

}

else

{

mergeHead=head2;

mergeHead->next=mergeOrderedLinkedListRecursion(head1,head2->next);

}

return mergeHead;

}

以上就是c++ 如何合并两个有序链表的详细内容,更多关于c++ 合并两个有序链表的资料请关注脚本之家其它相关文章!

用c语言合并两个有序单链表,c++ 如何合并两个有序链表相关推荐

  1. 两个无序单链表,排序后合并成一个有序链表

    两个无序单链表,排序后合并成一个有序链表 算法思想:用冒泡法,对链表1和2进行排序,对排序后的两个链表,从小到大进行循环,装入链表3中. #include<stdio.h> #includ ...

  2. 链表问题19——合并两个有序的单链表

    题目 给定两个有序单链表的头节点head1和head2,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点. 思路 本题较为简单,假设两个链表的长度分别为M和N,直接给出时间复杂度为O ...

  3. 两个有序单链表的合并排序算法

    设计两个有序单链表的合并排序算法 ListList MergeList(LiskList La, LinkList Lb){Lnode *pa = La->next;Lnode *pb = Lb ...

  4. 链表题目---3 合并两个有序单链表 和 分割链表

    合并两个有序单链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *nex ...

  5. 两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc

    #include<iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  6. 合并两个有序单链表,使得合并后的链表仍然有序

    在<剑指offer>里有一道笔试面试题:合并两个有序单链表,使得合并后的链表仍然有序.书中巧妙的利用了递归方法实现了该函数功能. 显然,利用递归算法能够让代码看起来非常简洁且容易看懂,但如 ...

  7. 习题2.5 两个有序链表序列的合并 (15 分)

    习题2.5 两个有序链表序列的合并 (15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L ...

  8. LeetCode Merge k Sorted Lists(有序单链表数组的合并)

    题意:给出一个有序单链表数组,将其合并成一个有序单链表 思路:将其转化成两个单链表合并的问题,用递归方式来实现 代码如下: public class Solution {private ListNod ...

  9. 6-3 两个有序链表序列的合并

    6-3 两个有序链表序列的合并 (15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L2 ...

  10. 两个有序链表序列的合并

    习题2.5 两个有序链表序列的合并 (15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L ...

最新文章

  1. 3-flutter 项目结构 资源 依赖
  2. JSON 数据格式解析(转)
  3. javascript 之 push方法
  4. mysql 备份库的shell_MySQL数据库的shell脚本自动备份
  5. P3177-[HAOI2015]树上染色【树形dp】
  6. 学习笔记-记ActiveMQ学习摘录与心得(二)
  7. 安卓 camera 调用流程_安卓如何做出微信那样的界面仿微信“我”的界面1/5
  8. android外置sd大小,android 读取外置和内置存储卡路径和大小
  9. 新手也能看懂的 SpringBoot 异步编程指南
  10. Flask 学习 (二) blueprint 示例
  11. Linux系统学习: 进程、重定向和管道指令:xargs 指令的作用是
  12. QT实现MQTT客户端
  13. P-6002-10PK,P-6002-2PK脂质研究工具解析
  14. html文字段落i排版,i排版基础操作GIF版
  15. UNITY自动化测试简单方法
  16. c语言 统计数量用count_C语言中count是什么意思?
  17. 一曲罢已,愁若梨花,乱红释怀,浮躁尽然。。。。。。
  18. C语言图书馆如何添加图书,如何使用C语言编写图书馆管理系统?
  19. b站如何进行屏幕录制?录屏最值得尝试的几款软件
  20. 方向向量转欧拉角_【姿态表示】旋转向量、旋转矩阵、欧拉角、四元数

热门文章

  1. 笔记本计算机bios设置,联想笔记本BIOS设置详解
  2. 马尔可夫模型(MM) 马尔可夫链
  3. 华为服务器找不到阵列卡_DELL R730服务器配置RAID及安装服务器系统
  4. NXP K60单片机Altium Designer电路设计教程(智能车)
  5. PDF加密如何解除?教你2个PDF解密方法
  6. 滑动窗口协议如何实现流量控制
  7. 直播带货软件开发,android的仿制直播点赞功能特效
  8. 微信公众号获取openid流程
  9. IE插件加载问题调试
  10. 2021年终总结,我躺平了?