将两个递增有序的单链表合并成一个非递增有序的单链表。头插法建立单链表算法)c语言
时间: 2024-06-15 08:06:49 浏览: 164
将两个递增有序的单链表合并成一个非递增有序的单链表可以使用头插法建立单链表的算法。具体步骤如下:
1. 定义一个新的链表头节点,初始化为空。
2. 分别遍历两个递增有序的单链表,比较节点的值大小。
3. 如果第一个链表的节点值小于等于第二个链表的节点值,则将第一个链表的节点插入到新链表的头部,并更新第一个链表的指针。
4. 如果第一个链表的节点值大于第二个链表的节点值,则将第二个链表的节点插入到新链表的头部,并更新第二个链表的指针。
5. 重复步骤3和步骤4,直到其中一个链表遍历完毕。
6. 将剩余未遍历完的链表直接连接到新链表的头部。
7. 返回新链表的头节点。
以下是C语言实现该算法的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 头插法建立单链表
ListNode* createList(int* arr, int size) {
ListNode* head = NULL;
for (int i = size - 1; i >= 0; i--) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = arr[i];
newNode->next = head;
head = newNode;
}
return head;
}
// 合并两个递增有序的单链表为非递增有序的单链表
ListNode* mergeLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = (ListNode*)malloc(sizeof(ListNode));
dummy->next = NULL;
ListNode* cur = dummy;
while (l1 && l2) {
if (l1->val <= l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if (l1) {
cur->next = l1;
}
if (l2) {
cur->next = l2;
}
ListNode* newHead = dummy->next;
free(dummy);
return newHead;
}
// 打印链表
void printList(ListNode* head) {
ListNode* cur = head;
while (cur) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
int main() {
int arr1[] = {1, 3, 5};
int arr2[] = {2, 4, 6};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int size2 = sizeof(arr2) / sizeof(arr2[0]);
ListNode* l1 = createList(arr1, size1);
ListNode* l2 = createList(arr2, size2);
printf("原始链表1:");
printList(l1);
printf("原始链表2:");
printList(l2);
ListNode* mergedList = mergeLists(l1, l2);
printf("合并后的链表:");
printList(mergedList);
return 0;
}
```
阅读全文
相关推荐
















