已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。数据结构c语言写一个代码
时间: 2024-10-08 17:08:31 浏览: 54
在C语言中,为了将两个已知长度的单链表连接在一起,你可以使用迭代或者递归的方式。这里我给出一种迭代的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 创建一个新的节点
ListNode* createNode(int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 连接两个链表
ListNode* connectTwoLists(ListNode* ha, ListNode* hb, int m, int n) {
if (!ha || !hb) {
return ha ? ha : hb; // 如果有一个链表为空,则直接返回另一个
}
// 将hb的所有元素添加到ha的末尾
ListNode* current_hb = hb;
for (int i = 0; i < n; ++i) {
ha->next = current_hb;
ha = ha->next;
if (current_hb->next) {
current_hb = current_hb->next;
} else {
break; // 遇到hb链表的末尾
}
}
// 将ha的剩余部分连接回去(如果ha比hb长)
if (m > n) {
ha = ha->next;
}
// 返回连接后的链表头节点
return ha;
}
// 打印链表
void printList(ListNode* head) {
while (head) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 假设已经初始化了ha和hb指针
ListNode* ha = ...; // ha链表头
ListNode* hb = ...; // hb链表头
int m = ...; // ha链表长度
int n = ...; // hb链表长度
ListNode* hc = connectTwoLists(ha, hb, m, n);
printList(hc); // 输出连接后的链表
return 0;
}
```
阅读全文