c语言给定两个元素有序(从小到大)的链表,要求将两个链表合并成一个有序(从小到大)链表,
时间: 2023-05-27 08:03:02 浏览: 112
可以按照以下方法实现:
1. 定义一个新的链表,表示合并后的有序链表。
2. 初始化指向两个链表头结点的指针 p1和p2。
3. 当p1和p2都不为空时,比较它们的值,将较小的结点加入新链表,并将指针指向下一个结点。
4. 如果p1已经为空,将p2剩余的结点加入新链表。
5. 如果p2已经为空,将p1剩余的结点加入新链表。
6. 返回新链表的头结点。
具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) { // 如果l1为空,返回l2
return l2;
}
if (l2 == NULL) { // 如果l2为空,返回l1
return l1;
}
ListNode* p1 = l1; // 指向l1的指针
ListNode* p2 = l2; // 指向l2的指针
ListNode* newHead = NULL; // 合并后链表的头结点
ListNode* tail = NULL; // 指向合并后链表的尾结点
if (p1->val <= p2->val) { // 找到新链表的头结点
newHead = p1;
tail = p1;
p1 = p1->next;
} else {
newHead = p2;
tail = p2;
p2 = p2->next;
}
while (p1 != NULL && p2 != NULL) { // 合并链表
if (p1->val <= p2->val) {
tail->next = p1;
tail = p1;
p1 = p1->next;
} else {
tail->next = p2;
tail = p2;
p2 = p2->next;
}
}
if (p1 == NULL) { // 将剩余的结点加入新链表
tail->next = p2;
}
if (p2 == NULL) {
tail->next = p1;
}
return newHead;
}
int main() {
ListNode* l1 = (ListNode*) malloc(sizeof(ListNode));
ListNode* l2 = (ListNode*) malloc(sizeof(ListNode));
l1->val = 1;
l1->next = (ListNode*) malloc(sizeof(ListNode));
l1->next->val = 2;
l1->next->next = (ListNode*) malloc(sizeof(ListNode));
l1->next->next->val = 4;
l1->next->next->next = NULL;
l2->val = 1;
l2->next = (ListNode*) malloc(sizeof(ListNode));
l2->next->val = 3;
l2->next->next = (ListNode*) malloc(sizeof(ListNode));
l2->next->next->val = 4;
l2->next->next->next = NULL;
ListNode* newHead = mergeTwoLists(l1, l2);
while (newHead != NULL) {
printf("%d ", newHead->val);
newHead = newHead->next;
}
printf("\n");
return 0;
}
```
输出:1 1 2 3 4 4
阅读全文