在C++中合并两个链表的问题可以通过以下方式解决:
以下是一个示例代码:
#include <iostream>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
ListNode* curr = dummy; // 当前节点指针
while (l1 && l2) {
if (l1->val < l2->val) {
curr->next = l1;
l1 = l1->next;
} else {
curr->next = l2;
l2 = l2->next;
}
curr = curr->next;
}
// 将剩余的节点直接添加到新链表的末尾
if (l1) {
curr->next = l1;
}
if (l2) {
curr->next = l2;
}
ListNode* result = dummy->next; // 获取合并后的链表
delete dummy; // 释放虚拟头节点的内存
return result;
}
int main() {
// 创建链表1: 1 -> 2 -> 4
ListNode* l1 = new ListNode(1);
l1->next = new ListNode(2);
l1->next->next = new ListNode(4);
// 创建链表2: 1 -> 3 -> 4
ListNode* l2 = new ListNode(1);
l2->next = new ListNode(3);
l2->next->next = new ListNode(4);
// 合并两个链表
ListNode* mergedList = mergeTwoLists(l1, l2);
// 输出合并后的链表
ListNode* curr = mergedList;
while (curr) {
std::cout << curr->val << " ";
curr = curr->next;
}
std::cout << std::endl;
// 释放链表的内存
curr = mergedList;
while (curr) {
ListNode* temp = curr;
curr = curr->next;
delete temp;
}
return 0;
}
这个问题的解决方案是通过比较两个链表的节点值,逐个将较小的节点添加到新链表中,直到其中一个链表的指针为空。最后,将剩余的节点直接添加到新链表的末尾。这样可以保证合并后的链表仍然是有序的。
领取专属 10元无门槛券
手把手带您无忧上云