当前位置:   article > 正文

两个有序链表序列的合并

两个有序链表序列的合并

(最下边有完整代码及运行截图,中间部分仅提供思路,有残缺)

具体问题如下图所示

简单说一下思路

首先是常规定义一下单链表

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. }Node;

然后是将输入的数列存入链表中

创建一个head节点,head的指针域设为NULL,并用L指针指向head。

建立一个循环:在循环内接收输入的序列值(假设为) [ 1 2 3 4 5 -1] (用空格隔开),第一次循环,新建一个节点Node,并让L->next(此时L代表head)指向该新建节点Node,形成链表,其中Node数据域data存入1。按此操作依次进行,直到序列值-1

序列值=-1时,L指向的节点的指针域指向NULL,完成单链表

  1. Node* PutL()
  2. {
  3. Node head;
  4. Node* L= &head;
  5. head.next = NULL;
  6. int n;
  7. while (1)
  8. {
  9. scanf("%d", &n);
  10. if (n != -1)
  11. {
  12. L->next = (Node*)malloc(sizeof(Node));
  13. L->next->data = n;
  14. L = L->next;
  15. }
  16. else
  17. break;
  18. }
  19. L->next = NULL;
  20. return head.next;
  21. }

 然后就是最重要的合并功能

要合并单链表L1和单链表L2,我们首先定义一个空的链表L3

然后我们考虑如何将L1和L2的值如何放进L3

合并时要有这个思路

1.假设输入两个有序数列

 2.再加上对应指针,首先指向对应序列的头一个节点

 

 3.开始比较对应的值,输出较小的那一个(按题目要求

4.N1输出,将N1指向下一位,L3第一个节点data域等于1

 接着比较N1,N2

5.N2输出后,将N2指向下一位,L3第二个节点data域等于2

 接着比较N1,N2

 如此循环下去

若L1与L2长度不等时

易知L2肯定先输出完,即N2最先指向链表尾部,此时N1指向7,则将N1指向的节点包括后面的全部连接到L3即可 

当然此题并没有严格要求存入新链表,我们当场输出打印即可

完整代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node
  4. {
  5. int data;
  6. struct Node* next;
  7. }Node;
  8. Node* PutL()
  9. {
  10. Node head;
  11. Node* L= &head;
  12. head.next = NULL;
  13. int n;
  14. while (1)
  15. {
  16. scanf("%d", &n);
  17. if (n != -1)
  18. {
  19. L->next = (Node*)malloc(sizeof(Node));
  20. L->next->data = n;
  21. L = L->next;
  22. }
  23. else
  24. break;
  25. }
  26. L->next = NULL;
  27. return head.next;
  28. }
  29. int main()
  30. {
  31. Node* L1 = PutL();
  32. Node* L2 = PutL();
  33. int f=0;//处理空格
  34. while (L1&&L2)//两个链表都非空
  35. {
  36. if (L1->data > L2->data)//判断首源节点的data的大小
  37. {
  38. if (f)
  39. printf(" ");//当f=0时,进入else;f=1时输出空格
  40. else
  41. f = 1;
  42. printf( "%d",L2->data);
  43. L2 = L2->next;
  44. }
  45. else
  46. {
  47. if (f)
  48. printf(" ");
  49. else
  50. f = 1;
  51. printf("%d",L1->data);
  52. L1 = L1->next;
  53. }
  54. }
  55. while (L1)//当L1有剩余时
  56. {
  57. if (f)
  58. printf(" ");
  59. else
  60. f = 1;
  61. printf("%d",L1->data);
  62. L1 = L1->next;
  63. }
  64. while (L2)//当L2有剩余时
  65. {
  66. if (f)
  67. printf(" ");
  68. else
  69. f = 1;
  70. printf("%d",L2->data);
  71. L2 = L2->next;
  72. }
  73. if (f == 0)
  74. printf("NULL");//当f=0时,就证明没有进入任何一个循环,即新链表为空
  75. return 0;
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序安全守护者/article/detail/62959
推荐阅读
相关标签
  

闽ICP备14008679号