c1)实现链表的排序(升序) 2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。
时间: 2023-07-11 08:06:46 浏览: 81
Merge-linked-list.zip_linked list A B C
链表排序的一种常见方法是使用归并排序。具体步骤如下:
1. 如果链表为空或只有一个节点,则已经有序,直接返回。
2. 使用快慢指针找到链表的中间节点。
3. 递归地对链表的左半部分和右半部分进行排序。
4. 合并已排序的左半部分和右半部分。
代码实现如下:
```
ListNode* mergeSort(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* slow = head;
ListNode* fast = head->next;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* mid = slow->next;
slow->next = nullptr;
ListNode* left = mergeSort(head);
ListNode* right = mergeSort(mid);
return merge(left, right);
}
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* tail = &dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
```
对于两个有序链表的合并,可以使用双指针法,依次比较两个链表中的元素大小,将较小的元素接在结果链表的末尾。代码实现如下:
```
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* tail = &dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
```
阅读全文