【PAT】1028.List Sorting
发布人:shili8
发布时间:2025-01-08 12:28
阅读次数:0
**PAT1028.List Sorting**
在这个问题中,我们需要实现一个函数,能够对一个给定的链表进行排序。链表中的元素是按照某种顺序排列的,我们需要将这些元素重新排列成升序或降序。
### 链表结构定义首先,我们需要定义链表的结构:
cppstruct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} };
这个结构中,`val`表示链表中的元素值,而`next`指向下一个链表节点。
### 排序函数实现现在,我们可以开始实现排序函数:
cppListNode* sortList(ListNode* head) { // 如果链表为空,则直接返回 if (!head || !head->next) return head; // 将链表分成两个部分:前半部分和后半部分 ListNode* mid = getMid(head); ListNode* midNext = mid->next; mid->next = NULL; // 递归地对前半部分和后半部分进行排序 ListNode* left = sortList(head); ListNode* right = sortList(midNext); // 将两个有序链表合并起来 return mergeTwoLists(left, right); }
这个函数首先检查链表是否为空,如果是,则直接返回。然后,它将链表分成前半部分和后半部分,并递归地对每个部分进行排序。最后,它将两个有序链表合并起来。
### getMid函数实现`getMid`函数用于找到链表的中间节点:
cppListNode* getMid(ListNode* head) { // 如果链表只有一个元素,则返回该元素 if (!head || !head->next) return head; ListNode* slow = head; ListNode* fast = head; // 使用快慢指针找到链表的中间节点 while (fast->next && fast->next->next) { slow = slow->next; fast = fast->next->next; } return slow; }
这个函数使用快慢指针的方式来找到链表的中间节点。
### mergeTwoLists函数实现`mergeTwoLists`函数用于合并两个有序链表:
cppListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { // 如果l1为空,则返回l2 if (!l1) return l2; // 如果l2为空,则返回l1 if (!l2) return l1; // 合并两个链表 if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } }
这个函数首先检查两个链表是否为空,如果是,则直接返回一个空链表。然后,它合并两个有序链表。
### 总结在本文中,我们实现了一个对链表进行排序的函数。该函数首先将链表分成前半部分和后半部分,然后递归地对每个部分进行排序。最后,它将两个有序链表合并起来。这个函数使用快慢指针的方式来找到链表的中间节点,并使用递归的方式来实现链表的排序。
###代码示例
cppint main() { // 创建一个链表:1 ->2 ->3 ->4 ->5 ListNode* head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(4); head->next->next->next->next = new ListNode(5); // 对链表进行排序 ListNode* sortedHead = sortList(head); // 打印排序后的链表 while (sortedHead) { std::cout << sortedHead->val << " "; sortedHead = sortedHead->next; } return0; }
这个代码示例首先创建一个链表:1 ->2 ->3 ->4 ->5,然后对该链表进行排序。最后,它打印排序后的链表。
###代码注释
cpp// 对链表进行排序的函数ListNode* sortList(ListNode* head) { // 如果链表为空,则直接返回 if (!head || !head->next) return head; // 将链表分成前半部分和后半部分 ListNode* mid = getMid(head); ListNode* midNext = mid->next; mid->next = NULL; // 递归地对前半部分和后半部分进行排序 ListNode* left = sortList(head); ListNode* right = sortList(midNext); // 将两个有序链表合并起来 return mergeTwoLists(left, right); } // 获取链表的中间节点的函数ListNode* getMid(ListNode* head) { // 如果链表只有一个元素,则返回该元素 if (!head || !head->next) return head; ListNode* slow = head; ListNode* fast = head; // 使用快慢指针找到链表的中间节点 while (fast->next && fast->next->next) { slow = slow->next; fast = fast->next->next; } return slow; } // 合并两个有序链表的函数ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { // 如果l1为空,则返回l2 if (!l1) return l2; // 如果l2为空,则返回l1 if (!l2) return l1; // 合并两个链表 if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } }
这个代码注释首先对链表进行排序,然后获取链表的中间节点,并合并两个有序链表。