基于归并排序的链表排序

基于归并排序的链表排序 O(Nlogn)

要点:

  • 如何找到链表中的中心点——快慢“指针”
  • 归并排序的实现——采用递归的思维

LinkNode.java

package cn.stu.test;

public class LinkNode {
    int num;
    LinkNode next;

    public LinkNode(int num) {
        super();
        this.num = num;
        this.next = null;
    }
    public LinkNode() {
        super();
        this.next = null;
    }
}

LinkedListMergeSort.java

package cn.stu.test;

public class LinkedListMergeSort {
    /*用于寻找链表的中心点*/
    public static LinkNode getNode(LinkNode link){

        LinkNode fast,slow;
        fast = slow = link;
        while(fast.next != null&&fast.next.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    public static LinkNode sortMerge(LinkNode left,LinkNode right){

        LinkNode Head = new LinkNode();
        LinkNode temp = Head;
        while(left!=null &&right != null){
            if(left.num > right.num){
                temp.next = left;
                left = left.next;
            }else{
                temp.next = right;
                right = right.next;
            }
            temp = temp.next;
        }
        temp.next = (left == null)?right:left;

        return Head.next;
    }

    public static LinkNode sort(LinkNode link){

        if(link.next == null){
            return link;
        }

        LinkNode node = getNode(link);
        LinkNode node2 = node.next;

        node.next = null;

        return sortMerge(sort(link),sort(node2));

    }

    public static void main(String[] args) {
        LinkNode i1 = new LinkNode(98);
        LinkNode i2 = new LinkNode(34);
        LinkNode i3 = new LinkNode(43);
        LinkNode i4 = new LinkNode(11);
        LinkNode i5 = new LinkNode(44);
        LinkNode i6 = new LinkNode(54);
        LinkNode i7 = new LinkNode(12);

        i1.next = i2;
        i2.next = i3;
        i3.next = i4;
        i4.next = i5;
        i5.next = i6;
        i6.next = i7;
        i7.next = null;

        LinkNode node = i1;
        while(node != null){
            System.out.print(node.num+" ");//输出未排序的链表
            node = node.next;
        }

        System.out.println();
        System.out.println("----------------------------");

        node = sort(i1);
        while(node != null){
            System.out.print(node.num+" ");//输出经过排序的链表
            node = node.next;
        }
    }
}

重点在于理解中点的查找以及归并排序的思维

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值