链表排序
Posted liuweimingcprogram
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表排序相关的知识,希望对你有一定的参考价值。
https://leetcode.com/problems/insertion-sort-list/description/
1、归并排序:
#include <bits/stdc++.h> #include "table.h" using namespace std; typedef long long int LL; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode* findMid(ListNode *head) { if (head == NULL || head->next == NULL) return head; ListNode *slow = head, *fast = head->next; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } ListNode *tmp = slow->next; slow->next = NULL; return tmp; } ListNode* merge(ListNode* one, ListNode* two) { ListNode *first = NULL; if (one->val < two->val) { first = one; one = one->next; } else { first = two; two = two->next; } ListNode *ans = first; while (one && two) { if (one->val < two->val) { first->next = one; one = one->next; } else { first->next = two; two = two->next; } first = first->next; } while (one) { first->next = one; one = one->next; first = first->next; } while (two) { first->next = two; two = two->next; first = first->next; } return ans; } ListNode* guibin(ListNode* head) { if (head == NULL || head->next == NULL) return head; if (head->next->next == NULL) { if (head->val > head->next->val) { swap(head->val, head->next->val); } return head; } ListNode* mid = findMid(head); ListNode* one = guibin(head); ListNode* two = guibin(mid); return merge(one, two); } ListNode* insertionSortList(ListNode* head) { return guibin(head); } }; void work() { int a[] = {4, 1, 2, 3, 5, 8}; int len = sizeof(a) / sizeof(a[0]); ListNode* first = new ListNode(a[0]); ListNode* tmp = first; for (int i = 1; i < len; ++i) { first->next = new ListNode(a[i]); first = first->next; } tmp = t.insertionSortList(tmp); while (tmp) { printf("%d ", tmp->val); tmp = tmp->next; } } int main() { work(); return 0; }
以上是关于链表排序的主要内容,如果未能解决你的问题,请参考以下文章