C++ 链表排序 C++归并法+快速排序实现链表排序的方法
秦枫-_- 人气:0想了解C++归并法+快速排序实现链表排序的方法的相关内容吗,秦枫-_-在本文为您仔细讲解C++ 链表排序的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C++,链表排序,下面大家一起来学习吧。
本文主要介绍了C++归并法+快速排序实现链表排序的方法,分享给大家,具体如下:
我们可以试用归并排序解决:
对链表归并排序的过程如下。
找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。
对两个子链表分别排序。
将两个排序后的子链表合并,得到完整的排序后的链表
上述过程可以通过递归实现。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1 个节点时,不需要对链表进行拆分和排序。
class Solution { public: ListNode* sortList(ListNode* head) { return sortList(head, nullptr); } ListNode* mergesort(ListNode* head, ListNode* tail) { if (head == nullptr) { return head; } if (head->next == tail) { head->next = nullptr; return head; } ListNode* slow = head, * fast = head; while (fast != tail) { slow = slow->next; fast = fast->next; if (fast != tail) { fast = fast->next; } } return merge( mergesort(head, slow), mergesort(slow, tail)); } ListNode* merge(ListNode* head1, ListNode* head2) { ListNode* dummyHead = new ListNode(0); ListNode* temp = dummyHead, * temp1 = head1, * temp2 = head2; while (temp1 != nullptr && temp2 != nullptr) { if (temp1->val <= temp2->val) { temp->next = temp1; temp1 = temp1->next; } else { temp->next = temp2; temp2 = temp2->next; } temp = temp->next; } if (temp1 != nullptr) { temp->next = temp1; } else if (temp2 != nullptr) { temp->next = temp2; } return dummyHead->next; } };
快速排序不能随机选取节点,时间复杂度太高所以会超时
class Solution { public static ListNode sortList(ListNode head) { return quickSort(head ,null); } public static ListNode quickSort(ListNode head ,ListNode end){ if(head ==end || head.next ==end) return head; ListNode lhead = head ,utail = head ,p = head.next; while (p != end){ ListNode next = p.next; if(p.val < head.val){//头插 p.next = lhead; lhead = p; } else { //尾插 utail.next = p; utail = p; } p = next; } utail.next = end; ListNode node = quickSort(lhead, head); head.next = quickSort(head.next, end); return node; } }
加载全部内容