【leetcode100-033】【链表】排序链表

【题干】

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

【思路】

  • 递归版归并法链表版~没什么特别好说的(非递归版归并也是可以哒,但是马上要考试了今天懒得写了!打个flag在这里也许哪天想起来会补写一下)
  • 首先是分割,这一步在链表里会麻烦一点,因为要找到链表的中点,得用快慢指针,快指针每次移动 2 步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向链表的中点。
  • 对拆出的两个子链表递归的进行拆分,直到达到递归出口(只有一个节点)
  • 逐层归并有序的子链表,done。

【题解】

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        return sortList(head, nullptr);
    }

    ListNode* sortList(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;
            }
        }
        ListNode* mid = slow;
        return merge(sortList(head, mid), sortList(mid, 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;
    }
};

相关推荐

  1. leetcode100-033】【排序

    2024-01-11 05:42:01       39 阅读
  2. LeetCode热题100】【排序

    2024-01-11 05:42:01       46 阅读
  3. leetcode148. 排序

    2024-01-11 05:42:01       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-11 05:42:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-11 05:42:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-11 05:42:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-11 05:42:01       18 阅读

热门阅读

  1. C/C++指针、数组和结构体浅析

    2024-01-11 05:42:01       43 阅读
  2. 8大基本类型的转换和运算符

    2024-01-11 05:42:01       33 阅读
  3. 7593 蜘蛛、蜻蜓与蝉(2)

    2024-01-11 05:42:01       25 阅读
  4. Steam游戏特点,steam游戏如何购买和体验?

    2024-01-11 05:42:01       31 阅读