解题思路:创建-合并两个链表 - 归并排序即可
注意事项 记得释放内存。
参考代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int id;
int score;
struct ListNode*next;
} Node,*Lnode;
Lnode createNode(int num)
{
Lnode h = (Node*)malloc(sizeof(Node));
h->next=NULL;
Lnode r=h;
int i;
for(i=0; i<num; i++)
{
int x,y;
scanf("%d %d",&x,&y);
Node*s=(Lnode)malloc(sizeof(Node));
s->id=x;
s->score=y;
r->next=s;
r=s;
}
r->next=NULL;
return h;
}
Node* findMiddle(Node* head) {
if (head == NULL || head->next == NULL) {
return head;
}
Node* slow = head;
Node* fast = head->next;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
Node*mergeTwoLists(Node*head1,Node*head2) {
if(head1 == NULL || head2 == NULL) {
return head1 == NULL ? head2 : head1;
}
Node*head = head1 ->id <= head2->id ? head1 : head2;
Node*cur1 = head ->next;
Node*cur2 = head == head1 ? head2 : head1;
Node*pre = head;
while (cur1 != NULL && cur2 != NULL) {
if (cur1->id <= cur2->id) {
pre->next = cur1;
cur1 = cur1->next;
} else {
pre->next = cur2;
cur2 = cur2->next;
}
pre = pre->next;
}
pre->next = cur1 != NULL ? cur1 : cur2;
return head;
}
Node* mergeSort(Node* head) {
if (head == NULL || head->next == NULL) {
return head;
}
Node* mid = findMiddle(head);
Node* right = mid->next;
mid->next = NULL;
Node* left = head;
left = mergeSort(left);
right = mergeSort(right);
head = mergeTwoLists(left, right);
return head;
}
void printList(Lnode head) {
Node *cur = head;
while (cur != NULL) {
printf("%d %d\n",cur->id,cur->score);
cur = cur->next;
}
}
void freeList(Lnode head) {
Node *cur = head;
Node *next = NULL;
while (cur != NULL) {
next = cur->next;
free(cur);
cur = next;
}
}
int main() {
int m,n;
scanf("%d %d",&m,&n);
Lnode h1 = createNode(m);
Lnode h2 = createNode(n);
Lnode head = mergeSort(mergeTwoLists(h1->next, h2->next));
printList(head);
freeList(head);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复