(1)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。用c++语言写出代码。
时间: 2024-03-25 07:05:51 浏览: 60
以下是使用C++编写的代码示例,可以将两递增有序链表并为一个递增序链表,同时要结果链表仍使用来两个链表的存储空间,不另外占用其他存储空间,并且不允许有重复的数据。
```cpp
#includeiostream>
using namespace std;
// 定义链节点结构
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 合并两个递增有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode dummy(0); // 创建一个虚拟头节点
ListNode* curr = &dummy;
while (p1 != NULL && p2 != NULL) {
if (p1->val < p2->val) {
curr->next = p1;
p1 = p1->next;
} else if (p1->val > p2->val) {
curr->next = p2;
p2 = p2->next;
} else {
// 如果允许有重复数据,可以将下面的注释取消掉
// curr->next = p1;
// p1 = p1->next;
// curr = curr->next;
// 不允许有重复数据,直接跳过重复的节点
p1 = p1->next;
p2 = p2->next;
}
curr = curr->next;
}
// 合并剩余的节点
if (p1 != NULL) curr->next = p1;
if (p2 != NULL) curr->next = p2;
return dummy.next;
}
// 创建链表
ListNode* createList(int arr[], int n) {
ListNode* head = NULL;
ListNode* tail = NULL;
for (int i = 0; i < n; i++) {
ListNode* newNode = new ListNode(arr[i]);
if (head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 打印链表
void printList(ListNode* head) {
ListNode* p = head;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
int main() {
int arr1[] = {1, 3, 5};
int arr2[] = {2, 4, 6};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int n2 = sizeof(arr2) / sizeof(arr2[0]);
// 创建两个递增有序链表
ListNode* l1 = createList(arr1, n1);
ListNode* l2 = createList(arr2, n2);
cout << "原始链表1: ";
printList(l1);
cout << "原始链表2: ";
printList(l2);
// 合并两个链表
ListNode* mergedList = mergeTwoLists(l1, l2);
cout << "合并后的链表: ";
printList(mergedList);
return 0;
}
```
这段代码会创建两个递增有序链表,分别为`l1`和`l2`,然后调用`mergeTwoLists`函数将两个链表合并为一个递增有序链表,并将结果打印输出。
阅读全文