Contents

链表归并排序

链表的归并排序算法

归并排序主要就是分段+合并,可以自顶向下,也可以自底向上

合并

合并已经有基础:合并两个有序链表

也没有什么花招,就是两边同时出发遍历,只是写起来相对麻烦

leetcode官方给的合并算法:

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;
    }

优点在于增加了一个虚拟头节点,使得统一性更好,不必单独判断第一个

自底向上方法

每两个合并一下,为了能够表示,使用subLength这个变量来划分

先取出来,排序好,再链回路

挺烦的

自顶向下方法

指定头尾,不断二分,递归的方法

找到中间节点可以用快慢指针

感觉还是递归简单一点