用C语言将两个非递减的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间,表中不允许有重复数据
时间: 2024-11-22 10:28:54 浏览: 34
在C语言中,合并两个非递减的有序链表并保持递增顺序,可以采用双指针法来解决。这里是一个简单的步骤说明:
1. 定义一个新的链表结构体(如果还没有的话),用于保存合并后的节点。
2. 创建一个头结点,表示空链表,它将是新链表的起点。
3. 初始化两个指针`p1`和`p2`,分别指向第一个链表和第二个链表的头结点。
4. 空间复用:遍历两个链表,比较当前节点值。将较小的节点添加到新链表中,并将其链接到之前添加的节点之后。同时移动该链表的指针。
5. 如果其中一个链表结束,将另一个链表剩余的部分依次添加到新链表。
6. 当两个链表都遍历完后,新链表就是合并后的递增有序链表。
以下是伪代码示例:
```c
typedef struct Node {
int val;
struct Node* next;
} Node;
Node* mergeSortedLists(Node* list1, Node* list2) {
Node* dummy = (Node*)malloc(sizeof(Node)); // 创建头结点
dummy->next = NULL;
Node* p1 = list1, *p2 = list2, *newHead = dummy;
while (p1 && p2) {
if (p1->val <= p2->val) {
newHead->next = p1; // 将较小的节点添加到新链表
newHead = newHead->next;
p1 = p1->next;
} else {
newHead->next = p2;
newHead = newHead->next;
p2 = p2->next;
}
}
// 如果其中一个链表还有剩余节点,直接连接上去
if (p1)
newHead->next = p1;
else if (p2)
newHead->next = p2;
return dummy->next;
}
```
阅读全文