题目:排序链表

解法一:归并排序(分治)

时间复杂度:O(nlogn),空间复杂度:O(logn)

从上至下将链表拆分为长度为一的单链表,然后先对长度为1的链表排序,合并两个链表;

再对长度为2的两个链表排序,之后合并….以此类推,每次排序并合并一半链表,最终就可以得到有序的链表

具体实现:

mergeSort():

在头部定义一个哨兵节点,然后遍历比较left与right的值,如果left更小,就将当前left节点接到哨兵节点后面,并将left向后移动一位,继续比较(right同理);最后当left或者right其中一个为空,也就是该子链表遍历完成时,就直接将另一个链表接到末尾,此时返回的哨兵节点的next就是排序后的链表的头节点

sortList(): 在主函数中,需要不断地将链表分为两半(通过递归调用),之后每一层递归都会调用mergeSort函数对当前分割出来的两个链表进行排序,直到最后合成回初始的链表

解法二:归并排序(迭代)

ps:这里我还没看明白,之后再补上………………..

 1class Solution
 2{
 3public:
 4    ListNode* mergeSort(ListNode* left, ListNode* right)
 5    {
 6        ListNode* dummyNode = new ListNode(0);
 7        ListNode* trail = dummyNode;
 8        while(left && right)
 9        {
10            if(left->val < right->val)
11            {
12                trail->next = left;
13                left = left->next;
14            }
15            else
16            {
17                trail->next = right;
18                right = right->next;
19            }
20            trail = trail->next;
21        }
22        if(left)
23            trail->next = left;
24        else
25            trail->next = right;
26
27        return dummyNode->next;
28    }
29
30    ListNode* sortList(ListNode* head)
31    {
32        if(!head || !head->next) return head;
33
34        ListNode *slow = head, *fast = head->next;
35        while(fast && fast->next)
36        {
37            slow = slow->next;
38            fast = fast->next->next;
39        }
40        ListNode *second = slow->next;
41        slow->next = nullptr;
42        ListNode *first = head;
43
44        first = sortList(first);
45        second = sortList(second);
46
47        return mergeSort(first, second);
48    }
49};