Merge Sort

Sort List

Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5

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;
  }

}

注意:用两个指针来把链表分成两半;归并排序;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 说起归并排序(Merge Sort),其在排序界的地位可不低,毕竟O(nlogn)比较排序的三大排序方法,就是Qu...
    akak18183阅读 4,147评论 0 1
  • 归并排序在对数组排序的过程中,现递归的分为两半排序,再将结果归并起来。实现归并的一种直截了当的方式是将两个不同的有...
    sleepyjoker阅读 3,142评论 0 0
  • Merge Sort is based on the divide-and-conquer paradigm. M...
    Super_Alan阅读 2,507评论 0 0
  • 算法讲解: http://www.geeksforgeeks.org/merge-sort/ 测试题 Merge ...
    AlanMa阅读 3,081评论 0 0
  • 她变得愈发孤独 越来越不爱与人交流 她只是独处尽管她恨透了独处 她渴望陪伴但是却固执的孤独 她在矛盾中挣扎终于学会...
    小太阳rrr阅读 3,610评论 15 6

友情链接更多精彩内容