两个有序单链表合并C++
时间: 2024-10-25 08:17:43 浏览: 13
将两个已排序的单链表合并成一个新的有序单链表是一个常见的链表操作。你可以通过比较两个链表的头节点并选择较小的那个作为新链表的头,然后递归地对剩余部分进行同样的操作,直到其中一个链表为空。以下是C++的实现:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr) return l2;
if (l2 == nullptr) return l1;
// 如果l1的值小于l2,那么l1的下一个节点将是新链表的第一个元素
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
```
这个函数会不断比较两个链表的当前节点,选择较小的节点并递归处理剩下的部分,直到两个链表都遍历完。最后返回的是新链表的头节点。
相关问题
编写算法:将两个有序单链表合并(一元多项式的表示和相加)c++实现代码并运行
在C++中,我们可以编写一个算法来合并两个已排序的单链表,然后表示它们作为一元多项式,并将这两个多项式相加。这里我们假设每个节点包含整数值,可以视为多项式系数。首先,我们需要定义一个链表结构以及用于合并和相加的操作。
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构
struct ListNode {
int val; // 节点值
ListNode* next; // 指向下一个节点的指针
};
// 合并两个有序链表
ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr) return l2;
if (l2 == nullptr) return l1;
if (l1->val < l2->val) {
l1->next = mergeSortedLists(l1->next, l2);
return l1;
} else {
l2->next = mergeSortedLists(l1, l2->next);
return l2;
}
}
// 将链表转换为多项式表达式字符串
string listToPolynomial(ListNode* head) {
string result = "";
while (head != nullptr) {
result += to_string(head->val) + "x^" + to_string(head->next == nullptr ? 0 : 1) + " ";
head = head->next;
}
return result.substr(0, result.size() - 1); // 去掉末尾空格
}
int main() {
// 创建示例链表
ListNode* list1 = new ListNode{1, new ListNode{2, new ListNode{4, nullptr}}};
ListNode* list2 = new ListNode{1, new ListNode{3, new ListNode{5, nullptr}}};
// 合并链表
ListNode* mergedList = mergeSortedLists(list1, list2);
// 输出合并后的多项式
cout << "合并后的多项式: " << listToPolynomial(mergedList) << endl;
return 0;
}
```
在这个例子中,我们首先创建了两个已排序的链表`list1`和`list2`,然后通过`mergeSortedLists`函数合并它们。最后,我们使用`listToPolynomial`函数将合并后的链表转换成一元多项式形式并打印出来。
注意:这个程序假设链表存储的是从常数项到最高次项(一次项、常数项等),并且对于两个相同的值,先添加的链表会被优先选择。如果你想处理更复杂的场景(比如保留第一个出现的相同值),你需要对`mergeSortedLists`进行相应的修改。
通过数据结构的知识编写一个程序。建立单链表,在单链表中实现插入,删除和查找操作。将两个递增的有序单链表合并成一个非递减的有序单链表,不能用Python编程
在没有Python的情况下,我们可以选择一种常见的编程语言如C++来实现这个功能。首先,我们定义一个链表节点的数据结构:
```cpp
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
接下来,我们实现单链表的基本操作:
1. 插入元素:
```cpp
void insert(ListNode*& head, int val) {
ListNode* newNode = new ListNode(val);
if (!head) {
head = newNode;
} else {
ListNode* curr = head;
while (curr->next && curr->next->val < val) {
curr = curr->next;
}
newNode->next = curr->next;
curr->next = newNode;
}
}
```
2. 删除元素:
```cpp
ListNode* deleteNode(ListNode* head, int target) {
if (!head || !head->val) return head;
if (head->val == target) {
ListNode* temp = head;
head = head->next;
delete temp;
return head;
}
ListNode* curr = head;
while (curr->next && curr->next->val != target) {
curr = curr->next;
}
if (curr->next) {
curr->next = curr->next->next;
delete curr->next;
}
return head;
}
```
3. 查找元素:
```cpp
bool search(ListNode* head, int target) {
ListNode* curr = head;
while (curr) {
if (curr->val == target) return true;
curr = curr->next;
}
return false;
}
```
然后,合并两个递增有序链表:
```cpp
ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
ListNode* dummyHead = new ListNode(0);
ListNode* tail = dummyHead;
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
if (l1) tail->next = l1;
else tail->next = l2;
return dummyHead->next;
}
```
阅读全文