写一段c语言代码来做到合并俩个升序链表
时间: 2023-09-26 20:06:44 浏览: 95
### 回答1:
下面是一段C语言代码,用于合并两个升序链表:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *result = NULL;
ListNode *temp = NULL;
if (l1 == NULL) {
return l2;
} else if (l2 == NULL) {
return l1;
}
if (l1->val <= l2->val) {
result = l1;
l1 = l1->next;
} else {
result = l2;
l2 = l2->next;
}
temp = result;
while (l1 && l2) {
if (l1->val <= l2->val) {
temp->next = l1;
l1 = l1->next;
} else {
temp->next = l2;
l2 = l2->next;
}
temp = temp->next;
}
if (l1 == NULL) {
temp->next = l2;
} else if (l2 == NULL) {
temp->next = l1;
}
return result;
}
int main() {
ListNode *l1 = (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;
ListNode *l2 = (ListNode*) malloc(sizeof(ListNode));
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 *result = mergeTwoLists(l1, l2);
while (result) {
printf("%d ", result->val);
result = result->next;
}
return 0;
}
```
这段代码定义了一个结构体`ListNode`,表示链表节点,包含一个`val`成员表示节点值和一个`next`成员表示指向下一个节点的指针。`mergeTwoLists`函数用于合并两个升序链表,返回合并后的链表头节点指针。在主函数中,我们创建了两个升序链表,并调用`mergeTwoLists`函数将它们合并成一个新的升序链表,并打印出合并后的链表值。
### 回答2:
题目要求编写一段C语言代码来合并两个升序链表。
假设我们有两个链表分别为list1和list2,链表节点的结构体定义如下:
```c
struct ListNode {
int val;
struct ListNode* next;
};
```
我们可以通过以下步骤来合并这两个升序链表:
1. 首先声明一个新的链表节点,用于合并后的链表的头部;
2. 判断list1和list2哪个链表的第一个节点的值小,将较小的节点作为合并链表的第一个节点;
3. 将这个节点的指针赋值给合并链表的头部节点;
4. 然后将该节点从响应的链表中删去,并将这个节点的指针后移;
5. 依次比较两个链表的当前节点的值,将较小的节点接在合并链表的尾部,并且将该节点的指针后移;
6. 直到其中一个链表为空,此时将另一个链表中剩余的节点直接接在合并链表的尾部;
7. 返回合并链表的头节点。
下面是具体的代码实现:
```c
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* newHead = NULL;
struct ListNode* curr = NULL;
if(list1 == NULL) {
return list2;
} else if(list2 == NULL) {
return list1;
}
if(list1->val < list2->val) {
newHead = list1;
list1 = list1->next;
} else {
newHead = list2;
list2 = list2->next;
}
curr = newHead;
while(list1 && list2) {
if(list1->val < list2->val) {
curr->next = list1;
list1 = list1->next;
} else {
curr->next = list2;
list2 = list2->next;
}
curr = curr->next;
}
if(list1) {
curr->next = list1;
} else {
curr->next = list2;
}
return newHead;
}
```
通过上面的代码实现,我们就可以将两个升序链表合并为一个升序链表。
### 回答3:
以下是一个合并两个升序链表的C语言代码示例:
```c
#include<stdio.h>
#include<stdlib.h>
// 链表节点的结构体定义
struct ListNode {
int val;
struct ListNode* next;
};
// 创建新的链表节点
struct ListNode* createNode(int val) {
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 合并两个升序链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if (l1 == NULL) {
return l2;
}
if (l2 == NULL) {
return l1;
}
// 创建一个新的空链表,并用来比较和连接两个链表的节点
struct ListNode* dummy = createNode(0);
struct ListNode* tail = dummy;
// 比较并连接链表节点,直到其中一个链表为空
while (l1 != NULL && l2 != NULL) {
if (l1->val <= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
// 将剩余的链表连接到新链表的末尾
if (l1 != NULL) {
tail->next = l1;
}
if (l2 != NULL) {
tail->next = l2;
}
// 返回合并后的链表
return dummy->next;
}
int main() {
// 创建两个测试链表
struct ListNode* l1 = createNode(1);
l1->next = createNode(3);
l1->next->next = createNode(5);
struct ListNode* l2 = createNode(2);
l2->next = createNode(4);
l2->next->next = createNode(6);
// 合并链表
struct ListNode* mergedList = mergeTwoLists(l1, l2);
// 遍历并打印合并后的链表节点值
printf("合并后的链表节点值为:");
struct ListNode* current = mergedList;
while (current != NULL) {
printf("%d ", current->val);
current = current->next;
}
printf("\n");
return 0;
}
```
以上代码实现了合并两个升序链表的功能。首先,通过定义一个结构体`ListNode`来表示链表节点,然后在`mergeTwoLists`函数中,通过将两个链表节点逐个比较,并连接到一个新的空链表中,最终返回合并后的链表。在`main`函数中,创建了两个测试链表,然后调用`mergeTwoLists`函数进行合并,并打印合并后的链表节点值。
阅读全文