当前位置:   article > 正文

链表合并--给定两个元素有序(从小到大)的链表,要求将两个链表合并成一个有序(从小到大)链表,

链表合并--给定两个元素有序(从小到大)的链表,要求将两个链表合并成一个有序(从小到大)链表,
输入描述:
第一行输入第一个链表的结点数S1,S1<=100。
第二行输入S1个整数,两两之间用空格隔开。
第三行输入第二个链表的结点数S2,S2<=100。
第四行输入S2个整数,两两之间用空格隔开。
输出描述:
输出合并之后的链表结果,两两之间用空格隔开,末尾没有空格。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //先生成两个链表,然后依次遍历两个链表,并用数组保存两个链表的元素值,对数组进行快速排序,排序后的元素生成一个新链表即可。
  4. typedef struct node
  5. {
  6. int data;
  7. struct node * next;
  8. }Node;
  9. Node* init(); //链表初始化,生成头结点
  10. void create(Node *L,int n); //尾插法生成长度为n的链表
  11. void quicksort(int s[],int low,int high); //快速排序
  12. int partition(int s[],int low,int high);
  13. int main(){
  14. int n1,n2;
  15. Node *L1=init();
  16. scanf("%d",&n1);
  17. create(L1,n1);
  18. Node *L2=init();
  19. scanf("%d",&n2);
  20. create(L2,n2);
  21. int s[200]={0};
  22. int n=n1+n2;
  23. Node *tmp=L1->next;
  24. for(int i=0;i<n1;i++)
  25. {
  26. s[i]=tmp->data;
  27. tmp=tmp->next;
  28. }
  29. tmp=L2->next;
  30. for(int i=n1;i<n;i++)
  31. {
  32. s[i]=tmp->data;
  33. tmp=tmp->next;
  34. }
  35. quicksort(s,0,n-1);
  36. Node *L=init();
  37. Node *p=L;
  38. for(int i=0;i<n;i++)
  39. {
  40. Node *q=(Node*)malloc(sizeof(node));
  41. q->data=s[i];
  42. q->next=NULL;
  43. p->next=q;
  44. p=q;
  45. }
  46. p=L;
  47. for(int i=0;i<n;i++)
  48. {
  49. p=p->next;
  50. printf("%d ",p->data);
  51. }
  52. }
  53. Node* init(){ //链表初始化,生成头结点
  54. Node *L=(Node*)malloc(sizeof(node));
  55. L->next=NULL;
  56. return L;
  57. }
  58. void create(Node *L,int n){ //尾插法生成长度为n的链表
  59. Node *p=L;
  60. for(int i=0;i<n;i++)
  61. {
  62. Node *q=(Node*)malloc(sizeof(node));
  63. int e;
  64. scanf("%d",&e);
  65. q->data=e;
  66. q->next=NULL;
  67. p->next=q;
  68. p=q;
  69. }
  70. }
  71. void quicksort(int s[],int low,int high){ //快速排序
  72. if(low<high){
  73. int pivotpos=partition(s,low,high);
  74. quicksort(s,low,pivotpos-1);
  75. quicksort(s,pivotpos+1,high);
  76. }
  77. }
  78. int partition(int s[],int low,int high)
  79. {
  80. int pivot=s[low];
  81. while(low<high)
  82. {
  83. while(low<high&&pivot<=s[high])
  84. high--;
  85. s[low]=s[high];
  86. while(low<high&&pivot>=s[low])
  87. low++;
  88. s[high]=s[low];
  89. }
  90. s[low]=pivot;
  91. return low;
  92. }

运行结果:

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

闽ICP备14008679号