[PTA]实验11-2-5 链表拼接
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验11-2-5 链表拼接相关的知识,希望对你有一定的参考价值。
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:
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
- 提交结果:
- 源码:
#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;
}
/* 你的代码将被嵌在这里 */
struct ListNode* createlist() /*裁判实现,细节不表*/
{
struct ListNode* head, * tail; // 头节点、尾节点
tail = head = NULL;
int data;
scanf("%d", &data);
// 以#作为输入结束符
while (data!=-1)
{
// 为临时节点分配内存
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
// 临时节点指向空
temp->next = NULL;
// 存入数据
temp->data = data;
// 将第一个数据存入头节点
if (head == NULL)
{
head = temp;
}
else
{
// 将临时节点连接到链表尾
tail->next = temp;
}
// 更新尾节点
tail = temp;
scanf("%d", &data);
}
return head;
}
struct ListNode* mergelists(struct ListNode* list1, struct ListNode* list2)
{
// 新建一个有头节点的链表存储合并后的链表
struct ListNode* list = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* head = list;
// 当两个链表都不为空时,比较他们的值
// 直到其中一个链表被遍历完
while (list1 != NULL && list2 != NULL)
{
// list1的数据小于list2,将list1的该节点连接到list后
if (list1->data < list2->data)
{
// list指向list1
list->next = list1;
// list1后移,继续与list2比较
list1 = list1->next;
// list后移一位
list = list->next;
}
else
{
// 将list2的当前节点连接到list后
list->next = list2;
// list2后移
list2 = list2->next;
// list后移
list = list->next;
}
}
// 当list2先遍历完,把list1的剩余节点连接到list后
while (list1 != NULL)
{
// list1的节点连接到list后
list->next = list1;
// list1后移
list1 = list1->next;
// list后移
list = list->next;
}
// 当list1先遍历完,将list2的剩余元素连接到list后
while (list2 != NULL)
{
// 将list2的节点连接到list后
list->next = list2;
// list2后移
list2 = list2->next;
// list后移
list = list->next;
}
// list有头节点,不存储数据,返回头节点的下一节点
head = head->next;
return head;
}
- 参考文章:2-3 链表拼接 (20 分)
以上是关于[PTA]实验11-2-5 链表拼接的主要内容,如果未能解决你的问题,请参考以下文章