• 两个有序链表序列的交集


    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

    输入格式:

    输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

    输出格式:

    在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

    输入样例:

    1. 1 2 5 -1
    2. 2 4 5 8 10 -1

    输出样例:

    2 5
    1. // 引入输入输出流库
    2. #include
    3. // 引入字符串库
    4. #include
    5. // 使用标准命名空间
    6. using namespace std;
    7. // 定义链表节点结构体
    8. typedef struct ListNode {
    9. // 节点值
    10. int val;
    11. // 下一个节点指针
    12. ListNode* next;
    13. // 构造函数,初始化节点值和下一个节点指针
    14. ListNode(int x) : val(x), next(NULL) {}
    15. }ListNode_t;
    16. // 定义三个链表节点指针
    17. ListNode_t* s1, * s2, * s3;
    18. // 输入函数,用于构建链表
    19. ListNode_t* input() {
    20. // 节点值
    21. int val;
    22. // 头节点和当前节点指针
    23. ListNode_t* head, * p;
    24. head = p = NULL;
    25. // 输入节点值
    26. cin >> val;
    27. // 当节点值不为-1时,继续构建链表
    28. while (val != -1) {
    29. // 新建节点
    30. ListNode_t* node = new ListNode(val);
    31. // 如果当前节点为空,则将头节点和当前节点都指向新建节点
    32. if (p == NULL) {
    33. head = p = node;
    34. }
    35. // 否则,将当前节点的下一个节点指向新建节点,并将当前节点更新为新建节点
    36. else {
    37. p->next = node;
    38. p = p->next;
    39. }
    40. // 输入下一个节点值
    41. cin >> val;
    42. }
    43. // 返回头节点
    44. return head;
    45. }
    46. // 打印链表函数
    47. void print(ListNode_t* head) {
    48. // 当前节点指针
    49. ListNode_t* p = head;
    50. // 如果头节点为空,则输出"NULL"
    51. if (p == NULL) {
    52. cout << "NULL" << endl;
    53. return;
    54. }
    55. // 否则,遍历链表并打印节点值
    56. while (p) {
    57. if (p && p->next)
    58. cout << p->val << " ";
    59. else
    60. cout << p->val;
    61. p = p->next;
    62. }
    63. }
    64. // 求交集函数
    65. ListNode_t* intersection(ListNode_t* s1, ListNode_t* s2) {
    66. // 头节点和当前节点指针
    67. ListNode_t *head,*s3;
    68. head = s3 = NULL;
    69. // 当两个链表都不为空时,进行比较
    70. while (s1 && s2) {
    71. // 如果第一个链表的当前节点值大于第二个链表的当前节点值,则将第二个链表的当前节点向后移动
    72. if (s1->val > s2->val)
    73. s2 = s2->next;
    74. // 如果第一个链表的当前节点值小于第二个链表的当前节点值,则将第一个链表的当前节点向后移动
    75. else if (s1->val < s2->val)
    76. s1 = s1->next;
    77. // 如果两个链表的当前节点值相等,则将当前节点加入到交集链表中,并将两个链表的当前节点都向后移动
    78. else if(s1->val == s2->val){
    79. if (s3 == NULL) {
    80. head = s3 = s1;
    81. }
    82. else {
    83. s3->next = s1;
    84. s3 = s3->next;
    85. }
    86. s1 = s1->next;
    87. s2 = s2->next;
    88. }
    89. }
    90. // 返回交集链表的头节点
    91. return head;
    92. }
    93. // 主函数
    94. int main() {
    95. // 输入两个链表
    96. s1 = input();
    97. s2 = input();
    98. // 求两个链表的交集
    99. s3 = intersection(s1,s2);
    100. // 打印交集链表
    101. print(s3);
    102. // 返回0,表示程序正常结束
    103. return 0;
    104. }

  • 相关阅读:
    C++ string类(包括深浅拷贝)
    [C题目]力扣142. 环形链表 II
    基于java+SpringBoot+HTML+Mysq+微信小程序+小说阅读网站
    基于安卓平台的远程医疗APP设计
    数据结构之单链表
    如何使用生成式人工智能探索视频博客的魅力?
    Python之VScode基本开发环境
    PHP中“->“和“=>“的区别
    逻辑回归(Logistic Regression)
    代码审计——基础(JAVAEE)
  • 原文地址:https://blog.csdn.net/laocooon/article/details/133174490