我的思路是插入排序,然而时间超出限制!!!
时间复杂度是 O(nlogn) 的排序算法包括归并排序、堆排序和快速排序(快速排序的最差时间复杂度是 O(n 2)),最适合链表的排序算法是归并排序。
题目描述:
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3] 输出:[1,2,3,4]示例 2:
输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3:
输入:head = [] 输出:[]
思路:
148. 排序链表 - 力扣(LeetCode)
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
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 slow = head,fast=head;
//找到链表的一半的位置;
while(fast!=tail){//注意不是fast!=null
slow=slow.next;
fast=fast.next;
if(fast!=tail){ //注意不是fast!=null
fast=fast.next;
}
}
ListNode l1 = sortList(head,slow);
ListNode l2 = sortList(slow,fast);
ListNode l3 = merge(l1,l2);
return l3;
}
//合并链表
public ListNode merge(ListNode list1,ListNode list2){
ListNode newlist = new ListNode();
ListNode p=newlist;
while(list1!=null && list2!=null){
if(list1.val<=list2.val){
p.next=list1;
p=p.next;
list1=list1.next;
}
else{
p.next=list2;
p=p.next;
list2=list2.next;
}
}
if(list1!=null){
p.next=list1;
}
if(list2!=null){
p.next=list2;
}
return newlist.next;
}
}