c语言合并两个有序链表,使之仍然有序。
时间: 2024-03-25 09:35:34 浏览: 48
合并两个有序链表可以使用双指针的方法,具体步骤如下:
1. 定义一个新的链表头节点,并创建一个指针指向该节点。
2. 分别定义两个指针p和q,分别指向两个有序链表的头节点。
3. 比较p和q的值,将较小的节点加入到新的链表中,并将指针后移。如果p和q的值相等,任意一个节点都可以加入到新的链表中。
4. 重复步骤3,直到p和q中有一个指针指向了空节点。
5. 如果还有剩余的节点,将其直接加入到新的链表中。
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) return l2;
if (!l2) return l1;
ListNode dummy;
dummy.val = 0;
dummy.next = NULL;
ListNode *p = l1, *q = l2, *cur = &dummy;
while (p && q) {
if (p->val < q->val) {
cur->next = p;
p = p->next;
} else if (p->val > q->val) {
cur->next = q;
q = q->next;
} else {
cur->next = p;
p = p->next;
q = q->next;
}
cur = cur->next;
}
cur->next = p ? p : q;
return dummy.next;
}
int main() {
ListNode *l1 = (ListNode*)malloc(sizeof(ListNode));
ListNode *l2 = (ListNode*)malloc(sizeof(ListNode));
ListNode *p = l1, *q = l2;
// 初始化有序链表l1
p->val = 1;
p->next = (ListNode*)malloc(sizeof(ListNode));
p = p->next;
p->val = 3;
p->next = (ListNode*)malloc(sizeof(ListNode));
p = p->next;
p->val = 5;
p->next = NULL;
// 初始化有序链表l2
q->val = 2;
q->next = (ListNode*)malloc(sizeof(ListNode));
q = q->next;
q->val = 4;
q->next = (ListNode*)malloc(sizeof(ListNode));
q = q->next;
q->val = 6;
q->next = NULL;
// 合并两个有序链表
ListNode *merged = mergeTwoLists(l1, l2);
// 打印合并后的有序链表
p = merged;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
return 0;
}
```
阅读全文