数据结构两个链表合并保持有序,重复元素保留一个,用C语言写一个代码给我
时间: 2024-10-20 12:03:02 浏览: 39
为了将两个已排序的链表合并成一个新的有序链表,并去除重复的元素,你可以使用递归的方式实现。以下是C语言的一个示例代码:
```c
#include <stdlib.h> // 包含malloc和free库
// 定义链表节点结构
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 合并两个链表并删除重复元素
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2; // 如果l1为空,则返回l2
if (!l2) return l1; // 如果l2为空,则返回l1
// 比较当前节点值,选择较小的添加到结果链表,并移动原链表指针
if (l1->val <= l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
ListNode* temp = mergeTwoLists(l1, l2->next); // 移动l2指针,继续比较
l2->next = temp;
return l2;
}
}
// 创建新链表头结点
ListNode* createListNode(int val) {
ListNode* node = (ListNode*) malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 测试代码
int main() {
// 示例链表,例如 l1 = [1, 2], l2 = [2, 3]
ListNode* l1 = createListNode(1);
l1->next = createListNode(2);
ListNode* l2 = createListNode(2);
l2->next = createListNode(3);
// 合并并删除重复元素
ListNode* mergedList = mergeTwoLists(l1, l2);
// 打印合并后的链表
while (mergedList) {
printf("%d ", mergedList->val);
mergedList = mergedList->next;
}
// 清理内存
freeListNode(mergedList); // 自定义的释放链表节点的函数
return 0;
}
```
注意,上面的代码示例中`freeListNode()`是一个假设的函数,你需要编写一个函数来释放节点的内存,实际项目中需要处理这个部分。同时,这里简化了处理,没有处理链表结束的情况,实际应用中需要考虑这种情况。
阅读全文