归并排序再复习

排序链表

leetcode 148题:本题目要求将链表进行排序。时间复杂度为O(nlogn)的排序算法有:归并排序、堆排序、快排。其中由于链表不能随机读取,归并排序最适合链表的排序。

归并排序

归并排序是一个分治的过程。

  1. 找到链表的中点,以中点为界,将链表拆分为两个子链表。
  2. 对两个链表分别归并排序。(递归过程,递归终止条件是不可再分,一个点)。
  3. 合并链表。(merge函数将两个有序链表合并)最终合并为一个链表。
class Solution{

	public ListNode sortList(ListNode head){
	//单链表的最末端一定是空,用空代表整个链表的尾端
		return sortList(head,null);
	}
	public ListNode sortList(ListNode head, ListNode tail){
		//递归终止条件
		if(head ==null)return head;
		if(head.next == tail){
			head.next = null;
			return head;
	//使用快慢指针,快指针走两步,慢指针走一步,取到链表中点
		ListNode fast = head,slow = head;
		while(fast != tail){
			slow = slow.next;
			fast = fast.next;
			if(fast != tail)
				fast = fast.next;
		}
		ListNode node1  = sortList(head,slow);
		ListNode node2 = sortList(slow,tail);
		ListNode sortnode = merge(node1,node2);
		return sortnode;
	}

	public ListNode merge(ListNode head1,ListNode head2){
		ListNode ans =new ListNode(0);
		ListNode tmp = ans;

		while(head1!=null && head2!=null){
			if(head1.val < head2.val){
				ans.next = head1;
				head1 = head1.next;
			}else{
				ans.next = head2;
				head2 = head2.next;
			}
			ans = ans.next;
		}
		if(head1 != null)
			ans.next = head1;
		if(head2 != null)
			ans.next = head2;
		return tmp.next;
	}
}

你可能感兴趣的:(刷题笔记,后端相关,链表,算法,快速排序)