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

剑指offer——面试题25:合并两个 排序的链表

自己答案:

 1 ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2)
 2 {
 3     if(pHead1==nullptr&&pHead2==nullptr)
 4         return nullptr;
 5 
 6     if(pHead1==nullptr)
 7         return pHead2;
 8 
 9     if(pHead2==nullptr)
10         return pHead1;
11 
12     ListNode* pHead=(pHead1->m_Value<pHead2->m_Value)?pHead1:pHead2;
13 
14     ListNode* pNode1=pHead1;
15     ListNode* pNode2=pHead2;
16     while(pNode1!=nullptr&&pNode2!=nullptr)
17     {
18         ListNode* pNext1=pNode1->m_pNext;
19         ListNode* pNext2=pNode2->m_pNext;
20 
21         if(pNode1->m_Value<pNode2->m_Value)
22         {
23             if((pNext1!=nullptr&&pNext1->m_Value>pNode2->m_Value)||pNext1==nullptr)
24                 pNode1->m_pNext=pNode2;
25             pNode1=pNext1;
26         }
27         else
28         {
29             if((pNext2!=nullptr&&pNext2->m_Value>pNode1->m_Value)||pNext2==nullptr)
30                 pNode2->m_pNext=pNode1;
31             pNode2=pNext2;
32         }
33     }
34     return pHead;
35 }
函数
#include"List.h"

void  Test(char* testName,ListNode* pHead,int* expect,int length)
{
    cout<<testName<<":";
    ListNode* pNode=pHead;
    int cnt=0;
    while(pNode!=nullptr)
    {
        if(pNode->m_Value!=expect[cnt])
            break;
        pNode=pNode->m_pNext;
        cnt++;
    }
    if(cnt==length)
        cout<<"Passed."<<endl;
    else
        cout<<"Failed."<<endl;
}

void Test1()
{
    ListNode* pNode1_1=nullptr;
    ListNode* pNode2_1=nullptr;
    ListNode*  pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    Test("test1",pHead,nullptr,0);
}

void Test2()
{
    ListNode* pNode1_1=nullptr;
    ListNode* pNode2_1=CreateListNode(1);
    ListNode* pNode2_2=CreateListNode(2);
    ConnectListNodes(pNode2_1,pNode2_2);
    ListNode*  pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[2]={1,2};
    Test("test2",pHead,data,2);
}

void Test3()
{
    ListNode* pNode2_1=nullptr;
    ListNode* pNode1_1=CreateListNode(1);
    ListNode* pNode1_2=CreateListNode(2);
    ConnectListNodes(pNode1_1,pNode1_2);
    ListNode*  pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[2]={1,2};
    Test("test3",pHead,data,2);
}

void Test4()
{
    ListNode* pNode2_1=CreateListNode(1);
    ListNode* pNode1_1=CreateListNode(1);
    ListNode* pNode1_2=CreateListNode(2);
    ConnectListNodes(pNode1_1,pNode1_2);
    ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[3]={1,1,2};
    Test("test4",pHead,data,3);
}

void Test5()
{
    ListNode* pNode2_1=CreateListNode(3);
    ListNode* pNode1_1=CreateListNode(1);
    ListNode* pNode1_2=CreateListNode(2);
    ConnectListNodes(pNode1_1,pNode1_2);
    ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[3]={1,2,3};
    Test("test4",pHead,data,3);
}

void Test6()
{
    ListNode* pNode2_1=CreateListNode(2);
    ListNode* pNode2_2=CreateListNode(4);
    ListNode* pNode2_3=CreateListNode(6);
    ConnectListNodes(pNode2_1,pNode2_2);
    ConnectListNodes(pNode2_2,pNode2_3);

    ListNode* pNode1_1=CreateListNode(1);
    ListNode* pNode1_2=CreateListNode(3);
    ListNode* pNode1_3=CreateListNode(5);
    ConnectListNodes(pNode1_1,pNode1_2);
    ConnectListNodes(pNode1_2,pNode1_3);
    ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[6]={1,2,3,4,5,6};
    Test("test6",pHead,data,6);
}

void Test7()
{
    ListNode* pNode2_1=CreateListNode(3);
    ListNode* pNode2_2=CreateListNode(4);
    ListNode* pNode2_3=CreateListNode(6);
    ConnectListNodes(pNode2_1,pNode2_2);
    ConnectListNodes(pNode2_2,pNode2_3);

    ListNode* pNode1_1=CreateListNode(1);
    ListNode* pNode1_2=CreateListNode(2);
    ListNode* pNode1_3=CreateListNode(7);
    ConnectListNodes(pNode1_1,pNode1_2);
    ConnectListNodes(pNode1_2,pNode1_3);
    ListNode* pHead=MergeTwoSortedList(pNode1_1,pNode2_1);
    int data[6]={1,2,3,4,6,7};
    Test("test7",pHead,data,6);
}

int main()
{
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();
    Test6();
    Test7();

    return 0;
}
测试代码

官方答案:

 1 ListNode* MergeTwoSortedListWihtRecursive(ListNode* pHead1,ListNode* pHead2)
 2 {
 3     if(pHead1==nullptr || pHead2==nullptr)
 4     {
 5         return nullptr;
 6     }
 7     if(pHead1==nullptr)
 8     {
 9         return pHead2;
10     }
11     if(pHead2==nullptr)
12     {
13         return pHead1;
14     }
15     
16     ListNode* pHead=nullptr;
17     
18     if(pHead1->m_Value<pHead2->m_Value)
19     {
20         pHead=pHead1;
21         pHead->m_pNext=MergeTwoSortedListWihtRecursive(pHead1->m_pNext,pHead2);
22     }
23     else
24     {
25         pHead=pHead2;
26         pHead->m_pNext=MergeTwoSortedListWihtRecursive(pHead1,pHead2->m_pNext);
27     }
28     return pHead;
29 }
函数(递归)
  1 // 面试题25:合并两个排序的链表
  2 // 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
  3 // 照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链
  4 // 表3所示。
  5 
  6 #include <cstdio>
  7 #include "..\Utilities\List.h"
  8 
  9 ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
 10 {
 11     if(pHead1 == nullptr)
 12         return pHead2;
 13     else if(pHead2 == nullptr)
 14         return pHead1;
 15 
 16     ListNode* pMergedHead = nullptr;
 17 
 18     if(pHead1->m_nValue < pHead2->m_nValue)
 19     {
 20         pMergedHead = pHead1;
 21         pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
 22     }
 23     else
 24     {
 25         pMergedHead = pHead2;
 26         pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
 27     }
 28 
 29     return pMergedHead;
 30 }
 31 
 32 // ====================测试代码====================
 33 ListNode* Test(char* testName, ListNode* pHead1, ListNode* pHead2)
 34 {
 35     if(testName != nullptr)
 36         printf("%s begins:\n", testName);
 37 
 38     printf("The first list is:\n");
 39     PrintList(pHead1);
 40 
 41     printf("The second list is:\n");
 42     PrintList(pHead2);
 43 
 44     printf("The merged list is:\n");
 45     ListNode* pMergedHead = Merge(pHead1, pHead2);
 46     PrintList(pMergedHead);
 47     
 48     printf("\n\n");
 49 
 50     return pMergedHead;
 51 }
 52 
 53 // list1: 1->3->5
 54 // list2: 2->4->6
 55 void Test1()
 56 {
 57     ListNode* pNode1 = CreateListNode(1);
 58     ListNode* pNode3 = CreateListNode(3);
 59     ListNode* pNode5 = CreateListNode(5);
 60 
 61     ConnectListNodes(pNode1, pNode3);
 62     ConnectListNodes(pNode3, pNode5);
 63 
 64     ListNode* pNode2 = CreateListNode(2);
 65     ListNode* pNode4 = CreateListNode(4);
 66     ListNode* pNode6 = CreateListNode(6);
 67 
 68     ConnectListNodes(pNode2, pNode4);
 69     ConnectListNodes(pNode4, pNode6);
 70 
 71     ListNode* pMergedHead = Test("Test1", pNode1, pNode2);
 72 
 73     DestroyList(pMergedHead);
 74 }
 75 
 76 // 两个链表中有重复的数字
 77 // list1: 1->3->5
 78 // list2: 1->3->5
 79 void Test2()
 80 {
 81     ListNode* pNode1 = CreateListNode(1);
 82     ListNode* pNode3 = CreateListNode(3);
 83     ListNode* pNode5 = CreateListNode(5);
 84 
 85     ConnectListNodes(pNode1, pNode3);
 86     ConnectListNodes(pNode3, pNode5);
 87 
 88     ListNode* pNode2 = CreateListNode(1);
 89     ListNode* pNode4 = CreateListNode(3);
 90     ListNode* pNode6 = CreateListNode(5);
 91 
 92     ConnectListNodes(pNode2, pNode4);
 93     ConnectListNodes(pNode4, pNode6);
 94 
 95     ListNode* pMergedHead = Test("Test2", pNode1, pNode2);
 96 
 97     DestroyList(pMergedHead);
 98 }
 99 
100 // 两个链表都只有一个数字
101 // list1: 1
102 // list2: 2
103 void Test3()
104 {
105     ListNode* pNode1 = CreateListNode(1);
106     ListNode* pNode2 = CreateListNode(2);
107 
108     ListNode* pMergedHead = Test("Test3", pNode1, pNode2);
109 
110     DestroyList(pMergedHead);
111 }
112 
113 // 一个链表为空链表
114 // list1: 1->3->5
115 // list2: 空链表
116 void Test4()
117 {
118     ListNode* pNode1 = CreateListNode(1);
119     ListNode* pNode3 = CreateListNode(3);
120     ListNode* pNode5 = CreateListNode(5);
121 
122     ConnectListNodes(pNode1, pNode3);
123     ConnectListNodes(pNode3, pNode5);
124 
125     ListNode* pMergedHead = Test("Test4", pNode1, nullptr);
126 
127     DestroyList(pMergedHead);
128 }
129 
130 // 两个链表都为空链表
131 // list1: 空链表
132 // list2: 空链表
133 void Test5()
134 {
135     ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
136 }
137 
138 int main(int argc, char* argv[])
139 {
140     Test1();
141     Test2();
142     Test3();
143     Test4();
144     Test5();
145 
146     return 0;
147 }
测试代码

 

转载于:https://www.cnblogs.com/acm-jing/p/10424002.html

相关文章:

  • 近期前端发展计划
  • 【Leetcode】101. 对称二叉树
  • 每秒解析千兆字节的JSON解析器开源,秒杀一大波解析器!
  • 解析DELL R710服务器迁移操作内容
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Git知识
  • cd命令
  • Mac 命令行美化
  • 写给自己看的发布react静态资源的方法
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • spring + angular 实现导出excel
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • Git for Windows 2.21.0 发布,Win 下的 Git 客户端
  • 聊聊flink的BlobWriter
  • PDF旋转使用的转换器有哪些
  • 【译】JS基础算法脚本:字符串结尾
  • Centos6.8 使用rpm安装mysql5.7
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • emacs初体验
  • Flannel解读
  • Hexo+码云+git快速搭建免费的静态Blog
  • IP路由与转发
  • Laravel Telescope:优雅的应用调试工具
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • WePY 在小程序性能调优上做出的探究
  • 电商搜索引擎的架构设计和性能优化
  • 关于字符编码你应该知道的事情
  • 欢迎参加第二届中国游戏开发者大会
  • 基于webpack 的 vue 多页架构
  • 聚类分析——Kmeans
  • 前端面试总结(at, md)
  • 山寨一个 Promise
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 原生Ajax
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 组复制官方翻译九、Group Replication Technical Details
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #《AI中文版》V3 第 1 章 概述
  • #1014 : Trie树
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (C语言)字符分类函数
  • (JS基础)String 类型
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十)T检验-第一部分
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .net core 6 redis操作类
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Micro Framework初体验
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅