设有n个待排序元素存放在一个不带表头结点的单链表中,每个链表结点只存放一个元素,头指针为 r,试设计一个算法,对其进行二路归并排序,要求不移动结点中的元素,只能改动各链表结点中的指针,排序后 r 仍指示结果链表的第一个结点。

解题思路:

1.不带头结点的尾插法:单独将第一个元素存入到结点中,再插在头指针后面,后面的结点正常插入。

2.归并排序:先划分,再归并

划分:使用递归,先用快慢指针找到链表中的中值,从中间咔叽。将链表中前半部分排序的结果同后半段的排序结果归并。

归并:so easy  自己看

#include<stdio.h>
#include<algorithm>
using namespace std;typedef struct Node
{int data;Node *next;
}Node,*List;List build(int a[])//将待排序元素存入单链表中,使用尾插法
{List r; //头指针 Node *head=(Node *)malloc(sizeof(Node));head->data=a[0];head->next=NULL;r=head;List tail=head;for(int i=1;i<5;i++){Node *p=(Node *)malloc(sizeof(Node));p->data=a[i];//p->next=tail->next;tail->next=p;tail=p;}tail->next=NULL;return r;
}void print(List r)
{Node *p=r;while(p){printf("%d ",p->data);p=p->next;}printf("\n");
}List merge(List h1,List h2)//归并
{List hh=(List)malloc(sizeof(Node));//建立新的头结点 List p=hh;//遍历指针 while(h1!=NULL&&h2!=NULL){if(h1->data < h2->data){p->next=h1;p=h1;h1=h1->next;}else{p->next=h2;p=h2;h2=h2->next;}}if(h1!=NULL)//h1元素没用完,直接接到表尾 {p->next=h1;}else if(h2!=NULL){p->next=h2;}return hh->next; }List sort(List r)//划分
{if(r->next==NULL)//若只有一个元素则返回 {return r;}List slow=r;List fast=r->next;while(fast!=NULL&&fast->next!=NULL)//快指针走到NULL时,slow正好在链表中间位置 {slow=slow->next;fast=fast->next->next;} List h1=sort(slow->next);//截取后半部分链表进行排序 slow->next=NULL;//断开链表 ,把后半段咔叽掉 return merge(sort(r),h1);//前半部分排序后和后半部分排序后链表进行归并
} int main()
{int a[5]={5,6,1,4,3};List r=build(a);print(r);r=sort(r);print(r);
}

2013软专算法题T2(基于链表的归并排序)相关推荐

  1. 直接插入排序_【真题讲解】15软专真题:直接插入排序

    本文转载自公众号"丽娃软工考研", 如需转载,请注明出处. 本周华师大迎来了一年一度的开学典礼. 校长钱旭红院士在开学典礼上进行了精彩的发言,全体新生共同聆听了钱院士讲授的第一堂思 ...

  2. 【笔试面试题】腾讯2013实习生面试算法题及参考答案

    总结了一下自己遇到的以及同学遇到的面试算法题,是技术二面. 有几道题给出了参考答案,还有几道没有好的思路.路过的大侠如果有好的思路请留个言交流下呗~ 1.八数码问题:3*3的格子,有1~8个数,空了一 ...

  3. leetcode算法题--回文链表

    原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/ 1.链表转数组 bool isPalindrome(ListNode* he ...

  4. 经典算法题 -- 判断单链表是否成环及寻找成环节点

    引言 判断单链表是否成环是一个计算机领域的经典算法问题 如何通过程序判断传入的链表是否存在环,并且求出环长度.成环点等问题 下面就是一个存在环的单链表 基本算法 -- hash 最简单的方法是创建一个 ...

  5. 算法题:删除链表中指定值的节点(Java实现)

    去美菜网面试,第一道算法笔试题就是这个,题目很清楚,删除链表中指定值的节点,假定有这样的链表:1->2->6->3->4->5->6,现在要求删除值为6的节点,输入 ...

  6. leetcode算法题--删除排序链表中的重复元素 II

    原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 1.map ListNode* deleteD ...

  7. 算法题26 复杂链表的复制

    题目 请实现函数 ComplexListNode clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个 next 域指向下一个结点外,还有一个 s ...

  8. 数据结构 - 链表 - 面试中常见的链表算法题

    数据结构 - 链表 - 面试中常见的链表算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. ...

  9. 字节跳动2021年4月面试算法题库

    本文汇总了牛客2021.4.1~2021.4.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

最新文章

  1. 《深入理解计算机系统》第十章——系统级I/0
  2. Oracle 11gR2构建RAC之(3)--安装grid前环境检测
  3. 皮一皮:今年的网友不够优秀啊。。。
  4. 安装程序无法创建新的系统分区也无法定位现有系统分区_如何拥有一个 Windows 10 和 Debian 10 的双系统...
  5. yum mysql5.7位置_CentOS yum 安装 Mysql5.7
  6. python画画用哪库好_数据可视化哪款工具更好用?对比7款Python 数据图表工具的性能...
  7. 2007标注没有文字_Hi,siri,你的商标注册了吗
  8. Android URI简介
  9. windows 虚拟磁盘的软链接_如何在Windows的操作系统下创建VHD虚拟磁盘
  10. HDFS伪分布式集群搭建
  11. i510200h和i78750h哪个好?有什么区别
  12. 图像处理:理想低通滤波器、butterworth滤波器(巴特沃斯)、高斯滤波器实现(python)
  13. 笔记本装服务器系统 无线网卡无法驱动,笔记本无线驱动,小编教你无线网卡驱动怎么安装...
  14. 【历史上的今天】11 月 8 日:为开源献身的互联网之子;卷积神经网络 LeNet-5 问世;特斯拉发明遥控器
  15. ncverilog脚本_nc-sim (irun)和verdi ncverilog,
  16. 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
  17. 49个excel常用技巧(五)
  18. python使用opencv实现文档扫描并提取文字
  19. linux下scala脚本运行报错error: expected class or object definition 解决方案
  20. Linux IPC:匿名管道 与 命名管道

热门文章

  1. JAVA WEB 实现第三方登录 -- qq篇
  2. Python Hander处理器以及自定义opener使用步骤
  3. Weex meets Vue,记一次 Weex 前端团队的讨论
  4. 享用一生100种最实用生活小窍门
  5. formdata传递参数_传formdata
  6. 机器学习中相关英文专业术语
  7. 亚马逊广告打造篇(第二期)
  8. 推荐4款好用的在线作图软件,可一键安装
  9. 马云:给创业者的15个忠告!
  10. android apn代码详解,android 代码设置apn