首页 > 编程语言 >Problem P07. [算法课分治] 链表排序(归并排序)

Problem P07. [算法课分治] 链表排序(归并排序)

时间:2022-09-05 13:13:19浏览次数:77  
标签:cnt ListNode val nullptr next 链表 P07 排序 root

image

采用归并算法,先将一个链表分成两个链表,分到不能再分,然后再将已经排好序的链表有序地归并起来。
主要问题:1. 一个子链表如何分成两个。2. 释放空间的问题(没有实现)

#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

int n;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

ListNode* mergeAction(ListNode* l, ListNode* r){
    ListNode* root = new ListNode();
    ListNode* cnt = root;
    while (l!=nullptr&&r!=nullptr) {
        if (l->val<r->val) {
            cnt->next = l;
            l = l->next;
        }else {
            cnt->next = r;
            r = r->next;
        }
        cnt=cnt->next;
    }
    if (l==nullptr) {
        cnt->next = r;
    }else {
        cnt->next = l;
    }
    return root->next;
}

ListNode* mergeSort(ListNode* head) {
    if (head->next == nullptr){
        return head;
    }
    // 将链表切成两段
    ListNode* p = head;
    ListNode* q = head;
    ListNode* pre = NULL;
    while (q != nullptr && q->next != nullptr) {
        pre = p;
        p = p->next;
        q = q->next->next;
    }
    pre->next = nullptr;

    // 递归调用排序方法,将两段进行排序
    ListNode* l = mergeSort(head);
    ListNode* r = mergeSort(p);

    // 将排序后的两段进行合并(merge)
    return mergeAction(l, r);
}


int main()
{
    ListNode *root = new ListNode();
    ListNode *cnt = root;
    while (1){
        int ret, val;
        ret = scanf("%d", &val);
        if (ret==EOF){
            break;
        }
        ListNode *next = new ListNode(val);
        cnt->next = next;
        cnt = cnt->next;
    }
    root = mergeSort(root->next);
    while(root!=nullptr){
        printf("%d ", root->val);
        root = root->next;
    }
    return 0;
}

标签:cnt,ListNode,val,nullptr,next,链表,P07,排序,root
From: https://www.cnblogs.com/understanding-friends/p/16657739.html

相关文章

  • 数据结构与算法学习笔记———链表(Linked List)
    链表(LinkedList)#该篇笔记转自【Python】python链表_小周ipython的博客-CSDN博客_python链表简介链表(LinkedList):是一种线性表数据结构。他是用一组任意的存储单元(可......
  • OpenHarmony中的HDF单链表及其迭代器
    概念为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构。单链表是链表中的一种,本文描述Open......
  • Stream流进行数组排序
    ​考虑一个数组:int[]nums={9,6,5,7,4,8,3,1,2};对于数组,列举几个转换Stream流的操作及返回值://返回Stream对象,但泛型为int[]数组Stream<int[]>nums1=Stream.of(n......
  • LeetCode 1387. 按幂值对整数进行排序
    LeetCode1387.按幂值对整数进行排序剛從南湖群峰下山,原本受了現在好像又胖回去了(哭[按幂值排序整数-LeetCode整数x的幂定义为使用以下步骤将x转换为1所需的......
  • js 实现计数排序
    //计数排序//稳定性:稳定//定义一个数组,将数组中每个元素出现的次数以数组形式保存起来,数组索引值即为具体key,数组索引对应的元素值即为该索引值出现的次数//再将......
  • 十大排序算法之【插入排序】
    插入排序的原理很简单:斗地主理牌的时候怎么操作就怎么操作。最简易版代码实现:#include<bits/stdc++.h>voidinsert_sort(vector<int>&in){for(inti=0;i<in.s......
  • 算法--链表
       方法一:构造链表如果此类型的题出现在笔试中,如果内存要求不高,可以采用如下方法:可以先用一个vector将单链表的指针都存起来,然后再构造链表。此方法简单易懂,代码好......
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)
    一、题目大意给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:h......
  • 数据结构与算法【Java】05---排序算法总结
    前言数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。要学习好数据结构就......
  • 设计链表
    设计链表设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使......