将两个升序链表合并为一个新的链表并返回,新链表是通过拼接给定的两个链表的所以节点组成的,输入第一行为n和m,分别为两个链表的长度且n大于等于1,m小于等于100第二行输入为链表list1第三行输入为链表list2,输出合并的链表C语言编译器
时间: 2025-05-27 22:30:48 浏览: 15
### C语言实现合并两个升序链表
以下是基于C语言编写的函数 `mergeTwoLists`,用于将两个已排序的单向链表合并为一个新的升序链表。此方法通过迭代的方式逐一比较两个链表中的节点值,并构建新的链表。
#### 完整代码实现
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体定义
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点的辅助函数
ListNode* createNode(int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (!newNode) {
printf("内存分配失败\n");
exit(1);
}
newNode->val = value;
newNode->next = NULL;
return newNode;
}
// 合并两个升序链表的核心逻辑
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
// 创建一个虚拟头节点以便简化边界条件处理
ListNode dummyHead = {0};
ListNode* tail = &dummyHead;
while (list1 && list2) {
if (list1->val <= list2->val) {
tail->next = list1;
list1 = list1->next;
} else {
tail->next = list2;
list2 = list2->next;
}
tail = tail->next; // 更新尾部指针
}
// 将剩余部分直接连接到结果链表后面
if (list1 != NULL) {
tail->next = list1;
} else {
tail->next = list2;
}
return dummyHead.next; // 返回实际的结果链表头部
}
```
#### 关键点解析
- **虚拟头节点**:为了减少对特殊情况(如初始状态或最终返回值)的额外判断,引入了一个临时的虚拟头节点 `dummyHead`[^4]。
- **循环终止条件**:当其中一个链表遍历完成后退出循环,此时另一个链表可能还有未处理的节点[^5]。
- **尾插法**:每次选取较小值的节点后将其追加至当前结果链表的末尾,保持整体有序性[^4]。
#### 测试用例
下面提供一段简单的测试程序来验证该算法的功能:
```c
void printList(ListNode* head) {
ListNode* current = head;
while (current != NULL) {
printf("%d ", current->val);
current = current->next;
}
printf("\n");
}
int main() {
// 初始化第一个链表: 1 -> 2 -> 4
ListNode* head1 = createNode(1);
head1->next = createNode(2);
head1->next->next = createNode(4);
// 初始化第二个链表: 1 -> 3 -> 4
ListNode* head2 = createNode(1);
head2->next = createNode(3);
head2->next->next = createNode(4);
// 调用合并函数
ListNode* mergedList = mergeTwoLists(head1, head2);
// 打印合并后的链表
printList(mergedList); // 输出: 1 1 2 3 4 4
return 0;
}
```
运行以上代码会输出如下结果:
```
1 1 2 3 4 4
```
这表明两个输入链表成功被合并成了单一的升序链表。
---
阅读全文
相关推荐



















