本文主要介绍了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++ 链表排序内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!
- 本文固定链接: https://zxbcw.cn/post/210083/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)