• java 归并排序 链表



    package wangChaoPA实习工作练习.com.leetcode;

    /**
     *
     * <p>
     * 描述该类情况 {@link 代表跟谁有关系}
     * </p>
     *
     * @author 王超
     * @since 1.0
     * @date 2017年5月10日 下午8:16:20
     * @see 新建|修改|放弃
     * @see wangChaoPA实习工作练习.com.leetcode.Sort_List 归并排序链表 算法先寻找链表的中节点,然后根据中节点进行分割
     *      ,对每一部分递归地应用归并排序.在两部分都排好序后,对它们进行归并
     */

    //链表类
    class ListNode
    {
        ListNode next;// 下一个节点
        int val;// 值

        ListNode(int x)
        {// 构造方法
            this.val = x;
            this.next = null;
        }
    }

    public class Sort_List
    {
        // 返回中结点
        static ListNode getMiddleOfList(ListNode head)
        {
            ListNode slow = head;
            ListNode fast = head;
            // slow走一步 ,fast走两步 最后的slow就是中点 快慢指针
            while (fast.next != null && fast.next.next != null)
            {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }

        // 测试的方法
        public static void main(String[] args)
        {
            ListNode list1 = new ListNode(9);
            ListNode list2 = new ListNode(8);
            ListNode list3 = new ListNode(6);
            ListNode list4 = new ListNode(7);
            ListNode list5 = new ListNode(10);
            list1.next = list2;
            list2.next = list3;
            list3.next = list4;
            list4.next = list5;
            list5.next = null;
            ListNode temp = sortList(list1);
            while (temp.next != null)
            {
                System.out.println("++++" + temp.val);
                temp = temp.next;
            }
        }

        // 排序
        static ListNode mergeList(ListNode a, ListNode b)
        {
            ListNode dummyHead = new ListNode(-1);// 假的头节点
            ListNode curr = dummyHead;// temp是个对象 改变curr的值就是改变temp中的值
            while (a != null && b != null)
            {
                if (a.val <= b.val)
                {
                    curr.next = a;
                    a = a.next;
                }
                else
                {
                    curr.next = b;
                    b = b.next;
                }
                curr = curr.next;
            }
            curr.next = (a != null) ? a : b;
            return dummyHead.next;// 返回第一个真正的节点
        }

        // 主要方法
        public static ListNode sortList(ListNode head)
        {
            // 如果head为空或其next为空 直接返回head
            if (head == null || head.next == null)
            {
                return head;
            }
            // 中点
            ListNode middle = getMiddleOfList(head);
            ListNode next = middle.next;// 中点的下一点
            middle.next = null;// 分割链表
            return mergeList(sortList(head), sortList(next));// 递归调用
        }
    }

  • 相关阅读:
    尽解powershell的workflow
    powershell玩转iis网站服务器
    Windows Terminal (Preview)治好了cmd,powershell的癌症
    博客园“NET Core 版博客系统”的运维浅见
    此贴告诉你:为啥shell脚本人,不建议学python
    关于revit的外部扩展存储
    Revit二次开发 屏蔽复制构件产生的重复类型提示窗
    xpath测试工具 xpath调试工具
    c# 防止重复运行 弹出已运行窗口并传递消息
    .NET APlayer播放器 demo
  • 原文地址:https://www.cnblogs.com/qingtianBKY/p/6838639.html
Copyright © 2020-2023  润新知