C语言实现:【问题描述】 将两个带头结点的升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。 【输入形式】 链表A长度 链表A 链表B长度 链表B 【输出形式】 合并后链表 【样例输入】 3 1 3 4 3 3 4 5 【样例输出】 1 3 3 4 4 5
时间: 2023-07-12 14:39:06 浏览: 85
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
struct ListNode {
int val;
struct ListNode *next;
};
// 创建新结点
struct ListNode *createNode(int val) {
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 将新结点插入到链表尾部
void insertTail(struct ListNode **head, int val) {
struct ListNode *node = createNode(val);
if (*head == NULL) {
*head = node;
} else {
struct ListNode *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
}
// 合并两个有序链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *head = NULL;
while (l1 != NULL && l2 != NULL) {
if (l1->val <= l2->val) {
insertTail(&head, l1->val);
l1 = l1->next;
} else {
insertTail(&head, l2->val);
l2 = l2->next;
}
}
while (l1 != NULL) {
insertTail(&head, l1->val);
l1 = l1->next;
}
while (l2 != NULL) {
insertTail(&head, l2->val);
l2 = l2->next;
}
return head;
}
// 打印链表
void printList(struct ListNode *head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
}
// 释放链表内存
void freeList(struct ListNode **head) {
struct ListNode *p = *head;
while (p != NULL) {
struct ListNode *temp = p;
p = p->next;
free(temp);
}
*head = NULL;
}
int main() {
int len1, len2, val;
struct ListNode *head1 = NULL, *head2 = NULL, *result = NULL;
scanf("%d", &len1);
for (int i = 0; i < len1; i++) {
scanf("%d", &val);
insertTail(&head1, val);
}
scanf("%d", &len2);
for (int i = 0; i < len2; i++) {
scanf("%d", &val);
insertTail(&head2, val);
}
result = mergeTwoLists(head1, head2);
printList(result);
freeList(&result);
return 0;
}
```
输入格式为链表长度和链表元素,通过 `insertTail` 函数将元素插入链表,然后调用 `mergeTwoLists` 函数合并两个链表并返回新链表,最后打印新链表元素并释放内存。
阅读全文