假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。用C语言数据结构编程
时间: 2024-10-12 15:14:52 浏览: 39
c++两有序单链表的合并算法
5星 · 资源好评率100%
为了合并两个按元素值递增顺序排列的单链表,并得到一个按元素值递减排序的新链表,我们可以采用双指针法以及临时节点来处理这个问题。这里是一个简单的C语言实现步骤:
1. 定义结构体`ListNode`表示链表节点,包含`val`(值)和`next`(指向下一个节点的指针)。
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
```
2. 创建一个函数`mergeLists`来进行链表的归并操作。
```c
ListNode* mergeLists(ListNode* list1, ListNode* list2) {
// 如果其中一个链表为空,则直接返回另一个链表
if (!list1) return list2;
if (!list2) return list1;
// 创建一个新的头节点
ListNode *newHead = (ListNode*)malloc(sizeof(ListNode));
newHead->val = list1->val; // 设置新链表的第一个元素为较大的
// 初始化两个指针,分别指向两个链表的当前节点
ListNode *ptr1 = list1, *ptr2 = list2;
while (ptr1 && ptr2) {
// 比较两个链表的当前节点值,选择较大者添加到新链表
if (ptr1->val > ptr2->val) {
newHead->next = ptr1;
ptr1 = ptr1->next;
} else {
newHead->next = ptr2;
ptr2 = ptr2->next;
}
newHead = newHead->next; // 移动新链表头部指针
}
// 将剩余未遍历完的链表连接到新链表末尾
if (ptr1) newHead->next = ptr1;
if (ptr2) newHead->next = ptr2;
return newHead;
}
```
3. 注意释放不再使用的原始链表内存:
```c
void freeList(ListNode* node) {
while (node) {
ListNode *temp = node;
node = node->next;
free(temp);
}
}
// 使用示例
ListNode* list1 = ...; // 初始化第一个链表
ListNode* list2 = ...; // 初始化第二个链表
ListNode* mergedList = mergeLists(list1, list2);
freeList(list1); // 可选:如果不需要保留原始链表,可以在这里释放它们
freeList(list2);
```
阅读全文