PTA实验 链表拼接 (20point(s))

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

struct ListNode {
    int data;
    struct ListNode *next;
};

函数接口定义:

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);

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

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode  *list1, *list2;

    list1 = createlist();
    list2 = createlist();
    list1 = mergelists(list1, list2);
    printlist(list1);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 3 5 7 -1
2 4 6 -1

输出样例:

1 2 3 4 5 6 7 

思路:

本题要求将两个链表合成一个内部元素升序排列的链表,所以先把两个链表合并为一个链表,然后用选择排序法对链表中的元素排序(:若两个链表均为空,则直接返回第一个链表)

实验代码

struct ListNode* mergelists(struct ListNode* list1, struct ListNode* list2)
{
    if (list1 == NULL && list2 == NULL)
    {
        return list1;
    }
    struct ListNode* ptr,*ptr1;
    int x;
    for (ptr = list1; ptr->next != NULL; ptr = ptr->next);
    ptr->next = list2;
    for (ptr = list1; ptr != NULL; ptr = ptr->next)
    {
        for (ptr1 = ptr->next; ptr1 != NULL; ptr1 = ptr1->next)
        {
            if (ptr->data > ptr1->data)
            {
                x = ptr1->data;
                ptr1->data = ptr->data;
                ptr->data = x;
            }
        }
    }
    return list1;
}

实验结果

原文地址:https://www.cnblogs.com/jk-liulei/p/12335420.html

时间: 2024-10-18 03:50:46

PTA实验 链表拼接 (20point(s))的相关文章

PTA实验报告(循环 数组 函数)

一.循环PTA实验作业 题目一.7-2 求平方根序列前N项和 1.本题PTA提交列表 2.设计思路 本题调用了sqrt数学函数计算平方根,其次只用了一层循环,计算平方根之后使用循环累加计算总和sum. 借助了中间值item去接收每一次的平方根值,再将其累加到sum中. 程序较为简单明了,使用for循环较为简单. 3.本题调试过程碰到问题及PTA提交列表情况说明. (1) for循环使用错误. 因为for语句只控制紧跟其后的一条语句, 而在第一次的提交过程中没有在for语句后加中括号, 没有将fo

实验11-2-5-链表 链表拼接 (20 分)

懒得放题目了,直接上答案,太难做了 struct ListNode* mergelists(struct ListNode* list1, struct ListNode* list2) { struct ListNode* head, * tmp, * t; head = (struct ListNode)malloc(sizeof(struct ListNode)); head->next = list1; tmp = head; if (list1 == NULL && lis

五、PTA实验作业(结构体)

1.提交列表 2.设计思路就是设计一个类似于在数组里面求最低和最大数值的函数 最终代码如下: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef struct Node{ char s[35]; double price; }Node; bool cmp(Node a, Node b){ return a.price<b.price; } int

PTA数据结构链表共享后缀的链表

需要考虑:有无交集:有多个字符相同,但只有最后两个是公共的:有一个单词为空:全相等: 汇总网上代码,解析如下: 首先求出len1和len2,若len1>len2,令p1指向链表中的第len1-len2+1个结点,若len2>len1,令p2指向链表中的第len2-len1+1个结点 ,然后将指针P1和p2同步向后移动,直到P1和p2指向同一结点,再比较接下来的几个节点 PtrToNode Suffix( List L1, List L2 ) { List P1,P2; P1=L1->Ne

PTA 求链表的倒数第m个元素

6-7 求链表的倒数第m个元素 (20 分) 请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>)个元素. 函数接口定义: ElementType Find( List L, int m ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typed

PTA 单链表分段逆转

6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4→3→2→1→5→6. 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data;

PTA实验第一次作业

#一PTA实验作业

题目一 include int days(int year,int month,int day); void main() { //定义函数,对给出年.月.日计算该天是该年的第几天 int year,month,day,d; printf("请输入年,月,日\n"); scanf("%d,%d,%d",&year,&month,&day); d=days(year,month,day); printf("这一天是该年的第%d天\n&

#pta实验作业

题目二数组练习 include void main() { while(1){ int a[10]={0,12,17,20,25,28,30}; int x,i,j=6; printf("原来的数组从小到大顺序如下\n"); printf("12,17,20,25,28,30\n"); printf("请输入要插的数\n"); scanf("%d",&x); a[0]=x; i=j; while(a[i]>x)