单链表的归并排序

来源:互联网 发布:js如何设置按钮 编辑:程序博客网 时间:2024/05/21 05:38
/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode sortList(ListNode head) {        //if(head == null) return null;        //ListNode res = split(head);        return split(head);    }    //使用快慢指针获取链表中点并进行分割    static ListNode split(ListNode head){        if(head == null || head.next == null)    return head;        ListNode p1 = head;        ListNode p2 = head.next;        while(p1 != null && p2 != null && p2.next != null){            p1 = p1.next;            p2 = p2.next.next;        }        ListNode right = split(p1.next);        p1.next = null;        ListNode left = split(head);        return merge(right, left);    }        //合并两个有序的链表    public static ListNode merge(ListNode list1, ListNode list2){        if(list1 == null)            return list2;        if(list2 == null)            return list1;        if(list1.val > list2.val){            list2.next = merge(list1, list2.next);            return list2;        }else{            list1.next = merge(list1.next, list2);            return list1;        }    }}