实习目的:熟练掌握链表的建立及基本操作 问题描述: 1)实现链表的排序(升序) 2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。 提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入: 2 1 2 3 1 2 3 输出结果为: 1 2 3 分别表示第一个链表元素个数为2,元素分别为 1,2 ;第二个链表元素个数为3,元素分别为1,2,3。
时间: 2024-03-03 17:48:38 浏览: 64
好的,我可以帮你解答这个问题。以下是我的回答:
1. 链表排序(升序):
算法思路:
1. 从头节点开始遍历链表,取出每个节点的值,存入一个数组中;
2. 对数组进行排序(升序);
3. 再次遍历链表,将排序后的数组中的值依次赋给链表的每个节点。
代码实现:(假设链表的节点结构体为 struct ListNode,节点的值域为 val,指向下一个节点的指针为 next)
```c++
void sortList(ListNode* head) {
vector<int> nums; // 存放链表节点的值
ListNode* p = head;
while (p != nullptr) {
nums.push_back(p->val);
p = p->next;
}
sort(nums.begin(), nums.end()); // 对数组进行排序
p = head;
for (int i = 0; i < nums.size(); i++) { // 将排序后的值依次赋给链表节点
p->val = nums[i];
p = p->next;
}
}
```
2. 两个有序链表的合并:
算法思路:
1. 定义一个新的链表,用于存放合并后的结果;
2. 分别遍历两个有序链表,比较每个节点的大小,将较小的节点插入到新链表的末尾;
3. 重复第二步,直到其中一个链表遍历完为止;
4. 将另一个链表剩余的节点依次插入到新链表的末尾。
代码实现:
```c++
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(0); // 定义一个新链表,用于存放合并后的结果
ListNode* p = head;
while (l1 != nullptr && l2 != nullptr) { // 分别遍历两个有序链表
if (l1->val < l2->val) { // 将较小的节点插入到新链表的末尾
p->next = l1;
l1 = l1->next;
} else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
// 将剩余的节点插入到新链表的末尾
if (l1 != nullptr) {
p->next = l1;
}
if (l2 != nullptr) {
p->next = l2;
}
return head->next;
}
```
以上就是我的回答,希望能对你有所帮助。
阅读全文