题目:https://oj.leetcode.com/problems/sort-list/
ort a linked list in O(n log n) time using constant space complexity.
分析:常数空间且O(nlogn),单链表适合用归并排序,双向链表适合用快速排序
源码:Java版本
算法分析:归并排序,时间复杂度O(nlogn),空间复杂度O(1)
/**
* 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 || head.next==null) {
return head;
}
ListNode slow=head,fast=head;
while(fast.next!=null && fast.next.next!=null) {
fast=fast.next.next;
slow=slow.next;
}
fast=slow;
slow=slow.next;
fast.next=null;
ListNode left=sortList(head);
ListNode right=sortList(slow);
return mergeTwoLists(left,right);
}
private ListNode mergeTwoLists(ListNode left,ListNode right) {
ListNode head=new ListNode(-1);
ListNode p=head;
while(left!=null && right!=null) {
if(left.val<right.val) {
p.next=left;
left=left.next;
}else {
p.next=right;
right=right.next;
}
p=p.next;
}
if(left!=null) {
p.next=left;
}
if(right!=null) {
p.next=right;
}
return head.next;
}
}
本文介绍了一种在单链表中实现归并排序的方法,该方法可以在O(n log n)的时间复杂度内完成排序,并且仅使用常数级别的额外空间。通过递归地将链表分成两半,分别排序后再进行合并,最终实现整个链表的有序排列。
462

被折叠的 条评论
为什么被折叠?



