c语言单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表,不能新建节点。完整代码
时间: 2024-09-18 07:15:47 浏览: 44
在C语言中,归并两个已排序的单链表并将它们合并成一个新的、非递增排序的链表,可以按照以下步骤进行:
1. 初始化指针:定义四个指针,分别指向两个输入链表的头结点以及合并后的链表(如果当前无元素,则分别对应`p1`, `p2`, `pResult` 和 `current`)。
```c
struct ListNode* p1 = head1; // 第一个链表头
struct ListNode* p2 = head2; // 第二个链表头
struct ListNode* pResult = NULL; // 合并后的链表头
struct ListNode* current = NULL; // 当前合并节点
```
2. 遍历链表:遍历每个链表,每次比较当前节点的值,选择较小的一个添加到结果链表,并更新指针。
```c
while (p1 && p2) {
if (p1->val <= p2->val) {
if (!pResult || pResult->val > p1->val) { // 如果结果为空或新节点小于现有节点
current = p1;
pResult = current;
} else {
current->next = p1;
}
p1 = p1->next;
} else {
if (!pResult || pResult->val > p2->val) { // 类似的条件判断,处理第二个链表
current = p2;
pResult = current;
} else {
current->next = p2;
}
p2 = p2->next;
}
}
```
3. 接尾部:遍历结束后,如果其中一个链表还有剩余的节点,将其直接添加到结果链表的尾部。
```c
if (p1) {
current->next = p1;
} else {
current->next = p2;
}
```
4. 计算长度:返回合并后链表的长度(即`current`所指位置之后的节点数)。
```c
int length = 0;
while (current->next != NULL) {
++length;
current = current->next;
}
```
完整的代码示例如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* mergeTwoLists(ListNode* head1, ListNode* head2) {
// ... 以上步骤的实现 ...
}
void printList(ListNode* head) {
ListNode* temp = head;
while (temp) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 创建并初始化两个链表...
ListNode* mergedHead = mergeTwoLists(head1, head2);
printf("Merged List: ");
printList(mergedHead);
printf("Length: %d\n", getLength(mergedHead)); // 使用自定义函数获取长度
return 0;
}
```
阅读全文