PTA C语言 浙江大学 函数题 6-32 链表拼接

以下是题目,函数接口定义,裁判测试程序样例

本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:

 

函数接口定义:

 

其中list1list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回结果链表的头指针。

裁判测试程序样例:

PTA C语言 浙江大学 函数题 6-32 链表拼接_第1张图片

 

输入与输出样例:

PTA C语言 浙江大学 函数题 6-32 链表拼接_第2张图片

 

代码测试规则:

PTA C语言 浙江大学 函数题 6-32 链表拼接_第3张图片

 

-----------------------------------------------------分割线-------------------------------------------------------------------

此部分为题目中struct ListNode *createlist()缺失部分,方便大家在自己的编译器上面进行样例测试等操作

struct ListNode *createlist(){
    struct ListNode *list1,*list2,*p1,*p2,*q1,*q2;
    list1 = NULL;
    list2 = NULL;
    q1 = NULL;
    q2 = NULL;
    int n,count=0;
    while(1){
        scanf("%d",&n);
        if(n==(-1)){
            break;
        }
        else{
            p1 = (struct ListNode *)malloc(sizeof(struct ListNode));
            count++;
            p1->data = n;
            if(count==1){
                list1 = p1;
                q1 = p1;
            }
            else{
                q1->next = p1;
                q1 = p1;
            }
        }
    }
    if(q1!=NULL){
        q1->next = NULL;
    }
    return list1;
}

此处为提交部分答案

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2){
    int a[1000],count=0,i,j,temp;
    struct ListNode *head,*p,*q;
    head = list1;
    q = list1;                                       
//提前保存list1的首地址,方便后面使用//
    if(list1==NULL&&list2==NULL){   //这里用来判断list1和list2的头结点是否都为空//
        return list1;                               //如果为空的话,直接返回list1的头结点//
    }
    while(1){
        if(head->next!=NULL){             
//遍历list1的头结点,直到NULL停止//
            head = head->next;
        }
        else{
            break;
        }
    }
    head->next = list2;                       
//将list1的尾结点与list2的头结点进行链接形成一个链表//
    p = q;                                            //保存list1的头结点//
    while(list1!=NULL){                       //此处list1为链接之后的新链表后进行遍历//
        a[count] = list1->data;               //将链表中的数据存入数组当中//
        count++;
        list1 = list1->next;                     
//移动至下一位//
    }
    a[count] = '\0';                             
//数组结束需要增加结束符号//
    list1 = p;                                       //将list1的位置回到头结点//
    for(i=0;i//数据排序//
        for(j=i+1;j             if(a[i]>a[j]){
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    p = list1;                                       
//回到头结点的位置,开始往下遍历//
    for(i=0;i//将数组的数据存入链表当中//
        p->data = a[i];
        p = p->next;
    }
    return list1;
}

看别的文章基本都是用一边遍历一边进行排序的方法对这道题进行求解,一开始自己写的时候,稍微在脑子里面想了想这种方法,但是发现我的脑子不够用,写不出来,随后就用了链表+数组的笨方法对这道题进行求解,方法虽然不够简洁方便,但是对初学者来说,应该是能很容易理解的。

此外,这道题有个bug,如果list1的头结点是空的,list2中有存储数据的话,是跑不了的,但是这道题的测试点忽略了这个地方,大家可以在我的代码的基础上加上if的判断语句啥的,对此进行修改。

此文章为作者本人原创,未经过允许,禁止装载!!!

你可能感兴趣的:(链表,c语言,数据结构)