1.分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node* next;
};
int main() {
struct node* head1, * head2, * p, * q, * tail1, * tail2, * tail;
int i, m, n;
scanf("%d%d", &m, &n);
head1 = (struct node*)malloc(sizeof(struct node));
head1->next = NULL;
tail1 = head1;
for (i = 0;i < m;i++) {
p = (struct node*)malloc(sizeof(struct node));
scanf("%d", &p->data);
p->next = NULL;
tail1->next = p;
tail1 = p;
}
head2 = (struct node*)malloc(sizeof(struct node));
head2->next = NULL;
tail2 = head2;
for (i = 0;i < n;i++) {
q = (struct node*)malloc(sizeof(struct node));
scanf("%d", &q->data);
q->next = NULL;
tail2->next = q;
tail2 = q;
}
p = head1->next;
q = head2->next;
head1->next = NULL;
tail = head1;
while (p && q) {
if (p->data < q->data) {
tail->next = p;
tail = p;
p = p->next;
tail->next = NULL;
}
else {
tail->next = q;
tail = q;
q = q->next;
tail->next = NULL;
}
}
if (p) {
tail->next = p;
}
else {
tail->next = q;
}
p = head1->next;
while (p) {
if (p->next) {
printf("%d ", p->data);
}
else {
printf("%d\n", p->data);
}
p = p->next;
}
}
2.给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
double findMedianSortedArrays(int*nums1,int*nums2,int numsSize,int nums2Size){
int right=nums1Size+nums2Size;
double nums[right];
while(1){
if(i<nums1Size&&j<nums2Size){
if(nums1[i]<nums2[j]){
nums[s++]=nums1[i];
i++;
}
else {
nums[s++]=nums2[j];
j++;
}
}
else if(i<nums1Size){
nums[s++]=nums1[i];
i++;
}
else if(j<nums2Size){
nums[s++]=nums2[j];
j++;
}
if(right%2){//如果right数组的个数为奇数
if(right/2+1==s){
return nums[s-1];
}
}
else if(right%2==0){//如果right数组的个数为偶数
if(right/2+1==s){
return (nums[s-1]+nums[s-2])/2;
}
}
}
return 0;
}
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出
int main()
{
int n = 0;
int m = 0;
int arr1[1000] = {0};
int arr2[1000] = {0};
//输入n和m
scanf("%d %d",&n,&m);
int i = 0;
int j = 0;
//输入两个升序序列
for(i=0; i<n; i++)
{
scanf("%d",&arr1[i]);
}
for(i=0; i<m; i++)
{
scanf("%d",&arr2[i]);
}
//合并有序序列并输出
i=0;j=0;
while(i<n && j<m)
{
if(arr1[i] < arr2[j]) ///拿arr1中的元素逐个与arr2中的第一个元素比较,小的输出在前
{
printf("%d ",arr1[i]);
i++;
}
else
{
printf("%d ",arr2[j]); //如果arr2中小的话输出arr2
j++;
}
}
//判断尚未遍历完的数组是否需要打印输出
if(i==n && j<m)
for(;j<m;j++)
printf("%d ",arr2[j]);
else
for(;i<n;i++)
printf("%d ",arr1[i]);
return 0;
}