【LeetCode】-Sort List

Sort a linked list in O(n log n) time using constant space complexity.

/**
 * 解题思路:
 * 分治递归的思想:1.将整个链表一分为二;2.对左右子链分别排序;3.将左右子链合并。
 * 
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
        private ListNode findMid( ListNode head ){
			ListNode slow = head;
			ListNode fast = head.next;
			while( fast!=null && fast.next!=null ){
				fast = fast.next.next;
				slow = slow.next;
			}
			return slow;
		}
		
		private ListNode mergeList( ListNode h1, ListNode h2 ){
			ListNode head = new ListNode(0);
			ListNode tail = head;
			while( h1!=null && h2!=null ){
				if( h1.val>=h2.val ){
					tail.next = h2;
					h2 = h2.next;
				}else{
					tail.next = h1;
					h1 = h1.next;
				}
				tail = tail.next;
			}
			if( h1!=null ){
				tail.next = h1;
			}else{
				tail.next = h2;
			}
			return head.next;
		}
    
        public ListNode sortList(ListNode head) {
            if( head==null || head.next==null )
    				return head;
    			ListNode mid = findMid(head);
    			ListNode h1 = sortList(mid.next);
    			mid.next = null;
    			ListNode h2 = sortList(head);
    		    return mergeList(h1,h2);     
        }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值