zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】Sort List

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


    题解:实现一个链表的归并排序即可。主要分为三部分:

    1.找到中点并返回的函数findMiddle;

    2.归并函数merge;

    3.排序函数sortList。

    数组的findMiddle函数非常容易实现,链表就有一点tricky了。首先设置两个指针,一个slow初始化为head,一个fast初始化为head.next,然后slow一次走一步,fast一次走两步,那么当fast达到终点的时候,slow就正好到达中点了。

    merge函数很简单,就是每次比较两个链表头结点的大小,把较小的拿过来放在新链表后面。

    sortList是一个递归的函数,分别递归的排序[head,mid]和[mid.next,tail]之间的元素,然后把它们归并。

    代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     private ListNode findMiddle(ListNode head){
    14       ListNode slow = head;
    15       ListNode fast = head.next;
    16       while(fast != null && fast.next != null){
    17           slow = slow.next;
    18           fast = fast.next.next;
    19       }
    20       return slow;
    21   }
    22   private ListNode merge(ListNode head1,ListNode head2){
    23       if(null == head1)
    24           return head2;
    25       if(null == head2)
    26           return head1;
    27       ListNode head;
    28       if(head1.val > head2.val){
    29           head = head2;
    30           head2 = head2.next;
    31       }
    32       else{
    33           head = head1;
    34           head1 = head1.next;
    35       }
    36       ListNode tail = head;
    37       while(head1 != null && head2 != null){
    38           if(head1.val > head2.val){
    39               tail.next = head2;
    40               head2 = head2.next;
    41           }
    42           else{
    43               tail.next = head1;
    44               head1 = head1.next;
    45           }
    46           tail = tail.next;
    47       }
    48       if(head1 != null)
    49           tail.next = head1;
    50       if(head2 != null)
    51           tail.next = head2;
    52       return head;
    53   }
    54   public ListNode sortList(ListNode head) {
    55       if(head == null || head.next == null)
    56           return head;
    57       ListNode mid = findMiddle(head);
    58       ListNode right = sortList(mid.next);
    59       mid.next = null;
    60       ListNode left = sortList(head);
    61       
    62       return merge(left,right);
    63   }
    64 }

    在人人上看到一个很好的汇集leetcode答案的网站:http://answer.ninechapter.com/,据说是google和facebook等工程师给出的答案,可以学习一下。

  • 相关阅读:
    linux less命令用法
    Spark-RDD 模型 以及运行原理
    Spark 架构原理介绍 以及 job、task、stag 概念
    Kafka 基本概念以及框架介绍
    负载均衡- TCP/ IP 基础知识
    JAVA多线程和并发基础面试题
    Java并发使用--线程池
    Java基础--并发编程
    事务实现原则(一) 事务的改变以及JDBC事务的设计
    Spark RDD Transformation和Action
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3842857.html
Copyright © 2011-2022 走看看