链表排序算法java实现(链表的快速排序、插入排序、归并排序)

左手的ㄟ右手 2022-05-09 05:54 362阅读 0赞

难易程度:★★

重要性:★★★

  1. 链表的排序相对数组的排序更为复杂些,也是考察求职者是否真正理解了排序算法(而不是“死记硬背”)
  1. 链表的插入排序

    1. public class LinkedInsertSort {
    2. static class ListNode {
    3. int val;
    4. ListNode next;
    5. ListNode(int x) {
    6. val = x;
    7. next = null;
    8. }
    9. }
    10. public static ListNode insertionSortList(ListNode head) {
    11. if(head==null||head.next==null) return head;
    12. ListNode pre = head;//pre指向已经有序的节点
    13. ListNode cur = head.next;//cur指向待排序的节点
    14. ListNode aux = new ListNode(-1);//辅助节点
    15. aux.next = head;
    16. while(cur!=null){
    17. if(cur.val<pre.val){
    18. //先把cur节点从当前链表中删除,然后再把cur节点插入到合适位置
    19. pre.next = cur.next;
    20. //从前往后找到l2.val>cur.val,然后把cur节点插入到l1和l2之间
    21. ListNode l1 = aux;
    22. ListNode l2 = aux.next;
    23. while(cur.val>l2.val){
    24. l1 = l2;
    25. l2 = l2.next;
    26. }
    27. //把cur节点插入到l1和l2之间
    28. l1.next = cur;
    29. cur.next = l2;//插入合适位置
    30. cur = pre.next;//指向下一个待处理节点
    31. }else{
    32. pre = cur;
    33. cur = cur.next;
    34. }
    35. }
    36. return aux.next;
    37. }
    38. }
  2. 链表的快速排序

    1. public static ListNode quickSort(ListNode begin, ListNode end) {
    2. //判断为空,判断是不是只有一个节点
    3. if (begin == null || end == null || begin == end)
    4. return begin;
    5. //从第一个节点和第一个节点的后面一个几点
    6. //begin指向的是当前遍历到的最后一个<= nMidValue的节点
    7. ListNode first = begin;
    8. ListNode second = begin.next;
    9. int nMidValue = begin.val;
    10. //结束条件,second到最后了
    11. while (second != end.next && second != null) {//结束条件
    12. //一直往后寻找<=nMidValue的节点,然后与fir的后继节点交换
    13. if (second.val < nMidValue) {
    14. first = first.next;
    15. //判断一下,避免后面的数比第一个数小,不用换的局面
    16. if (first != second) {
    17. int temp = first.val;
    18. first.val = second.val;
    19. second.val = temp;
    20. }
    21. }
    22. second = second.next;
    23. }
    24. //判断,有些情况是不用换的,提升性能
    25. if (begin != first) {
    26. int temp = begin.val;
    27. begin.val = first.val;
    28. first.val = temp;
    29. }
    30. //前部分递归
    31. quickSort(begin, first);
    32. //后部分递归
    33. quickSort(first.next, end);
    34. return begin;
    35. }
  1. 链表的归并排序

    1. public ListNode mergeSort(ListNode head){
    2. if(head==null || head.next==null) return head;
    3. ListNode mid = getMid(head);//获取链表中间节点
    4. //把链表从之间拆分为两个链表:head和second两个子链表
    5. ListNode second = mid.next;
    6. mid.next = null;
    7. //对两个子链表排序
    8. ListNode left = mergeSort(head);
    9. ListNode right = mergeSort(second);
    10. return merge(right,left);
    11. }
    12. //两个有序链表的归并
    13. private ListNode merge(ListNode l1,ListNode l2){
    14. //辅助节点,排好序的节点将会链接到dummy后面
    15. ListNode dummy = new ListNode(0);
    16. ListNode tail = dummy;//tail指向最后一个排好序的节点
    17. while(l1!=null&&l2!=null){
    18. if(l1.val<=l2.val){
    19. tail.next = l1;
    20. l1 = l1.next;
    21. }else{
    22. tail.next = l2;
    23. l2 = l2.next;
    24. }
    25. tail = tail.next; //移动tail指针
    26. }
    27. if(l1!=null)
    28. tail.next = l1;
    29. else
    30. tail.next = l2;
    31. return dummy.next;
    32. }
    33. //返回链表之间节点
    34. private ListNode getMid(ListNode head){
    35. if(head==null ||head.next==null) return head;
    36. ListNode slow = head;
    37. ListNode faster = head.next;
    38. while(faster!=null&&faster.next!=null){
    39. slow = slow.next;
    40. faster = faster.next.next;
    41. }
    42. return slow;
    43. }

扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享
公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

发表评论

表情:
评论列表 (有 0 条评论,362人围观)

还没有评论,来说两句吧...

相关阅读

    相关 归并排序插入排序

    由于最近在学习数据结构和算法,在牛客网 的在线编程题上遇到了对链表的相关排序操作,发现自己对链表这块还是理解不够深入,以前做过对数组进行排序,但链表的操作要比数组复杂一些,毕竟

    相关 排序--归并排序

    要求在空间复杂度为O(1)的情况下对链表进行排序,在不考虑时间复杂度的情况下可以考虑冒泡排序,只对链表中的值进行操作,这样时间复杂度为O(n^2)。用归并排序,时间复杂度为O(

    相关 排序-归并

    链表排序,可以插入排序,我就不写了。 实现归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Con