leetcode--SortList

来源:互联网 发布:美丽折淘宝客助手 编辑:程序博客网 时间:2024/06/06 04:04

因为需要时间复杂度为O(nlogn)所以考虑使用归并排序。ListNode不同于数组,因此要重写合并的方法和找中点的方法。这边找中点使用两个指针,一个快,一个慢。当慢指针到达链表尾端时,快指针到达链表中间。

/** * Created by marsares on 15/6/9. */public class SortList {    public ListNode sortList(ListNode head) {        if(head==null)return null;        if(head.next==null)return head;        ListNode mid=getMiddleNode(head);        return mergeTwoLists(sortList(head),sortList(mid));    }    public ListNode getMiddleNode(ListNode l){        ListNode slow=l;        ListNode fast=l;        ListNode tmp=null;        while(fast!=null){            if(fast.next==null)break;            tmp=slow;            slow=slow.next;            fast=fast.next.next;        }        tmp.next=null;        return slow;    }    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if(l1==null)return l2;        if(l2==null)return l1;        ListNode current=null;        if(l1.val<l2.val){            current=l1;            l1=l1.next;        }        else{            current=l2;            l2=l2.next;        }        ListNode first=current;        while(l1!=null&&l2!=null){            if(l1.val<l2.val){                current.next=l1;                l1=l1.next;            }else{                current.next=l2;                l2=l2.next;            }            current=current.next;        }        if(l1==null)current.next=l2;        if(l2==null)current.next=l1;        return first;    }    public void printList(ListNode l){        if(l==null)return;        while(l.next!=null){            System.out.print(l.val+"->");            l=l.next;        }        System.out.println(l.val);    }    public static void main(String[]args){        SortList sl=new SortList();        ListNode n1=new ListNode(5);        ListNode n2=new ListNode(1);        ListNode n3=new ListNode(2);        ListNode n4=new ListNode(4);        ListNode n5=new ListNode(3);        n1.next = n2;        n2.next=n3;        n3.next=n4;        n4.next=n5;        sl.printList(n1);        sl.printList(sl.sortList(n1));        /*ListNode m=sl.getMiddleNode(n1);        sl.printList(n1);        sl.printList(m);        ListNode m1=sl.getMiddleNode(n1);        sl.printList(n1);        sl.printList(m1);        sl.printList(sl.mergeTwoLists(n1,m1));*/    }}


0 0
原创粉丝点击