把两个带头结点的有序单链表A,B,合并成为有序的单链表C,A的遍历指针为pa,B的遍历指针为pb,采用非递归形式,使用C语言,给出代码
时间: 2024-12-13 07:19:14 浏览: 24
在C语言中,我们可以创建一个函数来合并两个有序的单链表。这个函数会首先比较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* pa, ListNode* pb) {
// 创建一个新链表作为结果
ListNode* pc = NULL; // 结果链表的头节点
ListNode* temp = NULL; // 指向当前插入位置
while (pa && pb) { // 当两个链表都不为空
if (pa->val <= pb->val) { // 如果A的值小于等于B的值
if (!pc || pa->val <= pc->val) { // 如果结果链表的第一个元素不合适 或者 A的值更小
temp = pa; // 将A的节点移动到结果链表
pa = pa->next;
} else {
temp = pc; // 否则,将结果链表保持不变,A的下一个节点加入
}
} else { // B的值小于A的值
if (!pc || pb->val <= pc->val) { // 类似上述情况,但是处理B
temp = pb;
pb = pb->next;
} else {
temp = pc;
}
}
if (temp != pc) { // 如果新节点不是第一个节点
pc->next = temp; // 将新节点连接到结果链表
}
pc = temp; // 更新结果链表当前节点为新节点
}
// 将剩余的部分添加到结果链表
if (pa) {
pc->next = pa;
} else if (pb) {
pc->next = pb;
}
return pc; // 返回合并后的链表头节点
}
// 打印链表
void printList(ListNode* head) {
ListNode *current = head;
while (current) {
printf("%d -> ", current->val);
current = current->next;
}
printf("NULL\n");
}
int main() {
// 初始化两个链表A和B...
// ...
// 调用mergeSortedLists函数合并它们
ListNode *mergedHead = mergeSortedLists(headA, headB);
// 打印合并后的链表C
printList(mergedHead);
return 0;
}
```
阅读全文