LeetCode刷题: 排序链表(day35)
题目描述:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路1:快速排序
贴代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
quickSort(head,null);
return head;
}
public void quickSort(ListNode head,ListNode end){
if(head!=end && head.next!=end){
ListNode q=partition(head,end);
quickSort(head,q);
quickSort(q.next,end);
}
}
public ListNode partition(ListNode head,ListNode end){
ListNode p=head;
ListNode cur=head.next;
int key=head.val;
while(cur!=end){
if(cur.val<=key){
p=p.next;
int tmp=p.val;
p.val=cur.val;
cur.val=tmp;
}
cur=cur.next;
}
int tmp=head.val;
head.val=p.val;
p.val=tmp;
return p;
}
}
执行结果:
执行耗时:
思路2:归并排序
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
return head == null ? null : mergeSort(head);
}
private ListNode mergeSort(ListNode head) {
if (head.next == null) {
return head;
}
ListNode p = head, q = head, pre = null;
while (q != null && q.next != null) {
pre = p;
p = p.next;
q = q.next.next;
}
pre.next = null;
ListNode l = mergeSort(head);
ListNode r = mergeSort(p);
return merge(l, r);
}
ListNode merge(ListNode l, ListNode r) {
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l != null && r != null) {
if (l.val <= r.val) {
cur.next = l;
cur = cur.next;
l = l.next;
} else {
cur.next = r;
cur = cur.next;
r = r.next;
}
}
if (l != null) {
cur.next = l;
}
if (r != null) {
cur.next = r;
}
return dummyHead.next;
}
}
执行耗时: