概述
本文主要介绍了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; } }
到此这篇关于C++归并法+快速排序实现链表排序的方法的文章就介绍到这了,更多相关C++ 链表排序内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!
最后
以上就是满意雨为你收集整理的C++归并法+快速排序实现链表排序的方法的全部内容,希望文章能够帮你解决C++归并法+快速排序实现链表排序的方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复