假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。(扩展:可以考虑再用顺序存储结构进行实现) 用C语言写一个完整的代码
时间: 2024-09-17 11:06:16 浏览: 47
数据结构 两个有序线性表的归并算法 西南交通大学
这个问题可以采用双指针法来解决,同时遍历两个递增排序的单链表。我们将当前节点的值较小的那个作为合并后链表的新节点,并更新指针指向下一个较小的值。以下是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* mergeLists(ListNode* list1, ListNode* list2) {
if (!list1 && !list2) {
return NULL;
}
if (!list1) {
return list2;
}
if (!list2) {
return list1;
}
// 指向较小元素的指针
ListNode* minPtr = list1->val < list2->val ? list1 : list2;
// 指向较大元素的指针
ListNode* maxPtr = list1->val > list2->val ? list1 : list2;
// 将最小元素添加到结果链表,并更新指针
minPtr->next = mergeLists(minPtr->next, maxPtr);
maxPtr->next = NULL; // 如果maxPtr未结束,将其设为NULL
return minPtr;
}
// 打印链表
void printList(ListNode* head) {
while (head) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表(这里仅用于测试,实际应用中需要输入或创建)
ListNode* list1 = createNode(5);
list1->next = createNode(3);
list1->next->next = createNode(7);
ListNode* list2 = createNode(4);
list2->next = createNode(6);
list2->next->next = createNode(8);
// 归并链表
ListNode* mergedList = mergeLists(list1, list2);
// 打印合并后的链表
printList(mergedList);
return 0;
}
```
这个代码首先检查两个链表是否为空,然后用两个指针分别跟踪当前最小值和最大值节点。每次迭代都将较小的节点添加到结果链表中,直到其中一个链表结束。最后返回合并后的链表头。
阅读全文