• 剑指offer——JZ25 合并两个排序的链表 解题思路与具体代码【C++】


    一、题目描述与要求

    合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com)

    题目描述

    输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

    数据范围: 0≤n≤1000,−1000≤节点值≤1000
    要求:空间复杂度 O(1),时间复杂度 O(n)

    如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

    或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

    示例

    示例1:

    输入:{1,3,5},{2,4,6}

    返回值:{1,2,3,4,5,6}

    示例2:

    输入:{},{}

    返回值:{}

    示例3:

    输入:{-1,2,4},{1,3,4}

    返回值:{-1,1,2,3,4,4}


    二、解题思路

    首先我们需要对两个表进行判断。一旦有一个表为空,则直接返回另一个表的头结点即可,如果两个链表都为空,则返回NULL。

    然后就是两个表都不为空的情况下如何去合并两个表,我们可以定义三个辅助指针pa、pb、pc,分别用于遍历需要合并的两个链表还有合并成的第三个链表,还有定义一个头结点pHead3,同于最后返回结果。接着分别判断两个表的第一个结点,取小的一方作为合并后的头结点,也就是pHead3所要指向的结点。

    然后就是对两个表同时进行遍历,然后判断当前pa和pb所指向的结点的值的大小,小者使pc指向它(合并),然后指针后移遍历下一个结点,一直到有一个表为空或者两个表都为空的情况则结束。

    当有一个表为空时,则只需要将剩下的那个表的结点以尾插法插入C中即可,可以用while,也可以利用条件表达式(更为简便)


    三、具体代码

    1. class Solution {
    2. public:
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. *
    6. *
    7. * @param pHead1 ListNode类
    8. * @param pHead2 ListNode类
    9. * @return ListNode类
    10. */
    11. ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
    12. // write code here
    13. if(pHead1==NULL&&pHead2!=NULL){ //如果表1为空 表2不为空则直接返回表2
    14. return pHead2;
    15. }else if(pHead1!=NULL&&pHead2==NULL){ //如果表2为空 表1不为空则直接返回表1
    16. return pHead1;
    17. }else if(pHead1==NULL&&pHead2==NULL){ //两个表都为空返回NUL
    18. return NULL;
    19. }else{
    20. ListNode *pa,*pb,*pc,*q,*pHead3;
    21. pa=pHead1;
    22. pb=pHead2;
    23. if(pa->val<=pb->val){
    24. pc=pa;
    25. pHead3=pc;
    26. pa=pa->next;
    27. }
    28. else{
    29. pc=pb;
    30. pHead3=pc;
    31. pb=pb->next;
    32. }
    33. while(pa&&pb){ //两表都不为空
    34. if(pa->val<=pb->val){
    35. pc->next=pa;
    36. pc=pa;
    37. pa=pa->next;
    38. }
    39. else{
    40. pc->next=pb;
    41. pc=pb;
    42. pb=pb->next;
    43. }
    44. }
    45. // while(pa){ //表1不为空
    46. // q=pa->next;
    47. // pa->next=NULL;
    48. // pc->next=pa;
    49. // pc=pa;
    50. // pa=q;
    51. // }
    52. // while(pb){
    53. // q=pb->next;
    54. // pb->next=NULL;
    55. // pc->next=pb;
    56. // pc=pb;
    57. // pb=q;
    58. // }
    59. pc->next=pa?pa:pb;
    60. return pHead3;
    61. }
    62. }
    63. };

  • 相关阅读:
    发音测评 kaldi compute gop 保姆级实战指南
    大一暑假 前端vue3基于阿里云物联网平台获取单片机数据与数据可视化项目开发历程记录
    (Java实习生)每日10道面试题打卡——Java基础知识篇
    Jmeter接口测试工具的一些使用小技巧
    Web基础 - JavaScript
    PG集合查询
    java,python遍历文件夹与子文件夹
    短信验证码服务
    Java开发学习(三十一)----Maven属性与版本管理
    mac中安装Homebrew
  • 原文地址:https://blog.csdn.net/m0_59800431/article/details/133555277