用VS写一个完整的合并两个有序链表程序,并且逐行注释
时间: 2023-12-08 20:03:44 浏览: 71
合并两个有序链表.md
好的,以下是使用 VS 编写的完整的合并两个有序链表程序,逐行注释:
```cpp
#include <iostream>
using namespace std;
// 定义链表结点
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {} // 构造函数
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2; // 如果 l1 为空,直接返回 l2
if (!l2) return l1; // 如果 l2 为空,直接返回 l1
ListNode* dummy = new ListNode(0); // 创建虚拟头结点
ListNode* cur = dummy; // 当前结点
// 遍历两个链表,直到其中一个链表为空
while (l1 && l2) {
if (l1->val <= l2->val) { // 如果 l1 的值小于等于 l2 的值
cur->next = l1; // 将 l1 的结点接到结果链表的尾部
l1 = l1->next; // l1 向后移动一位
} else { // 如果 l2 的值小于等于 l1 的值
cur->next = l2; // 将 l2 的结点接到结果链表的尾部
l2 = l2->next; // l2 向后移动一位
}
cur = cur->next; // 当前结点向后移动一位
}
cur->next = l1 ? l1 : l2; // 将剩余的链表接到结果链表的尾部
return dummy->next; // 返回真实头结点
}
// 输出链表
void printList(ListNode* head) {
ListNode* cur = head;
while (cur) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
int main() {
// 创建两个有序链表
ListNode* l1 = new ListNode(1);
l1->next = new ListNode(2);
l1->next->next = new ListNode(4);
ListNode* l2 = new ListNode(1);
l2->next = new ListNode(3);
l2->next->next = new ListNode(4);
// 输出原始链表
cout << "l1: ";
printList(l1);
cout << "l2: ";
printList(l2);
// 合并两个有序链表
ListNode* mergedList = mergeTwoLists(l1, l2);
// 输出合并后的链表
cout << "merged list: ";
printList(mergedList);
return 0;
}
```
这个程序首先定义了一个 `ListNode` 结构体,用于表示链表的结点。然后,`mergeTwoLists` 函数用于合并两个有序链表,返回合并后的链表的头结点。最后,`printList` 函数用于输出一个链表。
在 `main` 函数中,首先创建了两个有序链表 `l1` 和 `l2`,并输出它们的值。然后,调用 `mergeTwoLists` 函数合并这两个链表,并输出合并后的链表。
阅读全文