链表排序是链表有序合并的前提,所以就放在一起写了

链表的冒泡排序,

/**
     *  链表的冒泡排序
     *  排序思路:
     *  逐个节点进行排序
     *  把当前节点和下个节点的值进行比较,根据结果处理
     *  主要是更换了节点的值
     *  没有更换节点对象本身
     *
     * @param head
     * @return
     */
    static LinearList bubbleSort(LinearList head) {
        //判断链表是否需要排序
        if (head == null || head.nextNode == null) {
            return null;
        }
        //保存入参头节点的引用
        LinearList temp = head;

        /**
         * 尾部节点,是循环截止节点
         */
        LinearList tail = null;
        int in = 0;

        /**
         * 外部遍历是遍历每个节点
         */
        while(head.nextNode != tail) {
            /**
             * 内部遍历是把当前冒泡的节点进行逐个比较
             */
            while (head.nextNode != tail) {
                //互换节点的值
                if (head.i > head.nextNode.i) {
                    in = head.i;
                    head.i = head.nextNode.i;
                    head.nextNode.i = in;
                }
                //指针下移一位
                head = head.nextNode;
            }
            /**
             * tail作为遍历截止节点
             * 内部循环结束一次则成功把一个数放到它合适的位置,下次遍历不需要再遍历到已经排好位置的这个数
             * tail既是作为已经最后一个排好序的节点的引用
             */
            tail = head;
            //指针重新回到链表头部
            head = temp;
        }

        return head;
    }

 

循环方式完成两条链表有序合并

/**
     * 循环方式
     * 把两条两边合并为一条单调递增链表
     *
     * @param head
     * @param head1
     * @return
     */
    static LinearList merge(LinearList head,LinearList head1){

        /**
         * 声明两个链表节点实例
         * 分别保存两条链表排序后的头节点
         */
        LinearList temp = null,temp1 = null;

        /**
         * 对两条链表进行排序
         */
        temp = bubbleSort(head);
        temp1 = bubbleSort(head1);

        LinearList megre = null;

        /**
         *
         * 声明合并后的链表的头节点
         * 作为作为返回值
        */
        LinearList megre1 = null;

        /**
         * 比较两条链表的头节点
         * 确定谁的头节点作为合并后链表的头节点
         */
        if(temp.i>temp1.i){
            megre = temp1;
            temp1 = temp1.nextNode;
            megre1 = megre;
        }else{
            megre = temp;
            temp = temp.nextNode;
            megre1 = megre;
        }

        /**
         * 循环中一次对比两条链表指针所对应的节点的值
         * 值小的插入新链表中
         */
        while(temp != null || temp1 != null){
            System.out.println("----------");
            if(temp.i>temp1.i){
                megre.nextNode = temp1;
                temp1 = temp1.nextNode;
                megre = megre.nextNode;
                /**
                 * 如果再此次插入新链表的操作指针下移后
                 * temp1 节点所对应的链表已经没有下一个节点了
                 * 则把排序好的另一条链表的剩余部分直接插入新链表的下个节点
                 * 下面同理
                 */
                if(temp1 == null){
                    megre.nextNode = temp;
                    // 组合完毕 跳出循环
                    break;
                }
            }else{
                megre.nextNode = temp;
                temp = temp.nextNode;
                megre = megre.nextNode;
                if(temp == null){
                    megre.nextNode = temp1;
                    break;
                }
            }

        }
        //返回合并后新链表的头节点
        return megre1;
    }

递归方式完成链表的有序合并

因为排序不需要写进递归排序方法内,所以在调用递归合并方法前对两条链表进行排序

LinearList temp = Utils.bubbleSort(linearList);
	LinearList temp1 = Utils.bubbleSort(linearList1);
	linearList2 = Utils.merge1(temp,temp1);

接下来是递归合并方法

/**
     * 递归方式
     * 把链条两边合并成一条单调递增的链表
     * ps:因为排序不需要递归,所以再调用本方法前就进行排序
     * @param head1
     * @param head2
     * @return
     */
    static LinearList merge1(LinearList head1,LinearList head2){

        /**
         * 递归结束的标志
         * 其中一条链表没了就把另一条链表剩余部分接到新链表后面去
         */
        if(head1 == null) {
            return head2;
        }
        if (head2 == null){
            return head1;
        }
        /**
         * 声明两个链表节点实例
         * 分别保存两条链表排序后的头节点
         */
        LinearList temp1 = null,temp2 = null;

        /**
         * 对两条链表进行排序
         */
        temp1 = head1;
        temp2 = head2;

        //声明一个新链表头节点
        LinearList merge = new LinearList();

        /**
         * 比较链表1和链表2的值的大小
         * 值小的则插入新链表
         * 递归调用本方法,参数中节点插入新链表的链表指针下移一位
         * 返回值赋值给新链表新插入节点的下一节点
         */
        if(temp1.i>temp2.i){
            merge = temp2;
            merge.nextNode = merge1(temp1,temp2.nextNode);
        }else{
            merge = temp1;
            merge.nextNode = merge1(temp1.nextNode,temp2);
        }
        return merge;
    }

实现结果

链表1

java合并lsit JAVA合并链表后排序_链表

链表2

java合并lsit JAVA合并链表后排序_java合并lsit_02

 

新链表

java合并lsit JAVA合并链表后排序_递归_03