您的位置:首页 > 其它

LeetCode -- Sort List

2015-09-21 22:18 218 查看
Question:

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

Analysis:

问题描述:在O(n log n)时间内用常数的空间复杂度,完成一个链表的排序。

思考:排序时间复杂度为O(n log n)的话,快排、堆排序、归并排序都是O(n log n),而冒泡排序、交换排序、选择排序都是O(n2),就这道题来讲,很容易相当应该使用归并排序。

之前做过一个题目合并两个已经排好序的链表,因此这里的思路是:递归+归并排序。每次将当前链表分成两部分,排序后合并成一个链表。(注意归并的结束条件)

Answer:

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode slow = head, fast = head, firstList = head;

while(fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode secondList = slow.next;
slow.next = null;

ListNode first = null, second = null;
while(firstList != secondList) {
first = sortList(firstList);
second = sortList(secondList);
return mergeTwoLists(first, second);
}

return mergeTwoLists(first, second);
}

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;

if(l1 == null && l2 == null)
return null;
if(l1 == null && l2 != null)
return l2;
if(l1 != null && l2 == null)
return l1;

ListNode fakeHead = new ListNode(0);
ListNode p = fakeHead;

while (p1 != null && p2 != null){
if (p1.val <= p2.val) {
p.next = p1;
p1 = p1.next;
p = p.next;
} else {
p.next = p2;
p2 = p2.next;
p = p.next;
}
}

if(p1 != null)
p.next = p1;
if(p2 != null)
p.next = p2;
return fakeHead.next;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: