sort-list

来源:互联网 发布:人工智能计算器电脑版 编辑:程序博客网 时间:2024/06/01 22:24

Sort a linked list in O(n log n) time using constant space complexity.
大致意思:用常数空间复杂度和O(nlogn)的时间复杂度对链表排序。


考点:
1. 快慢指针;2. 归并排序。
此题经典,需要消化吸收。
复杂度分析:
T(n) 拆分 n/2, 归并 n/2 ,一共是n/2 + n/2 = n
/ \ 以下依此类推:
T(n/2) T(n/2) 一共是 n/2*2 = n
/ \ / \
T(n/4) ……….. 一共是 n/4*4 = n

一共有logn层,故复杂度是 O(nlogn)

关键代码:

/** * 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;    // step 1. cut the list to two halves    ListNode prev = null, slow = head, fast = head;    while (fast != null && fast.next != null) {      prev = slow;      slow = slow.next;      fast = fast.next.next;    }    prev.next = null;    // step 2. sort each half    ListNode l1 = sortList(head);    ListNode l2 = sortList(slow);    // step 3. merge l1 and l2    return merge(l1, l2);  }  ListNode merge(ListNode l1, ListNode l2) {    ListNode l = new ListNode(0), p = l;    while (l1 != null && l2 != null) {      if (l1.val < l2.val) {        p.next = l1;        l1 = l1.next;      } else {        p.next = l2;        l2 = l2.next;      }      p = p.next;    }    if (l1 != null)      p.next = l1;    if (l2 != null)      p.next = l2;    return l.next;  }}
原创粉丝点击