设A和B是两个按元素值非递减有序的单链表,写一算法将A和B归并为按元素值非递减有序的单链 表C,帮我用c语言写一个代码实现
时间: 2024-10-25 17:15:22 浏览: 29
当你需要合并两个已排序的单链表A和B,可以采用双指针法,分别遍历这两个链表,比较当前节点的值,将较小的那个添加到新链表C中,并更新指向下一个节点。以下是使用C语言的一个简单示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表结构体
typedef struct ListNode {
int val; // 节点值
struct ListNode *next; // 指向下一个节点的指针
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 归并两个有序链表
ListNode* mergeSortedLists(ListNode* A, ListNode* B) {
ListNode* dummyHead = createNode(0); // 创建虚拟头节点
ListNode* tail = dummyHead; // 尾部指针
while (A != NULL && B != NULL) {
if (A->val <= B->val) {
tail->next = A;
A = A->next;
} else {
tail->next = B;
B = B->next;
}
tail = tail->next;
}
// 如果其中一个链表还有剩余,则追加剩余部分
if (A != NULL) {
tail->next = A;
} else {
tail->next = B;
}
return dummyHead->next; // 返回实际链表头部
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 测试示例,这里假设A和B已经创建并按照升序排列
ListNode* A = ...; // 实际上要填入A链表头节点
ListNode* B = ...; // 实际上要填入B链表头节点
ListNode* C = mergeSortedLists(A, B);
printf("合并后的链表C: ");
printList(C);
return 0;
}
```
阅读全文