博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode之Sort List
阅读量:2342 次
发布时间:2019-05-10

本文共 2385 字,大约阅读时间需要 7 分钟。

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

 to see which companies asked this question

解题报告:就是对一个链表进行归并排序。

主要考察3个知识点,
知识点1:归并排序的整体思想
知识点2:找到一个链表的中间节点的方法
知识点3:合并两个已排好序的链表为一个新的有序链表
归并排序的基本思想是:找到链表的middle节点,然后递归对前半部分和后半部分分别进行归并排序,最后对两个以排好序的链表进行Merge

python代码:

# Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution(object):    def sortList(self, head):        """        :type head: ListNode        :rtype: ListNode        """        if head == None or head.next == None:            return head;                medium = self.getMiddle(head)        next = medium.next        medium.next = None                return self.mergeList(self.sortList(head), self.sortList(next))            def getMiddle(self, head):        slow = head        fast = head                while fast.next != None and fast.next.next != None:            slow = slow.next            fast = fast.next.next        return slow            def mergeList(self, former, latter):        dummy_head = ListNode(-1)        cur = dummy_head                while former != None and latter != None:            if former.val <= latter.val:                cur.next = former                former = former.next            else:                cur.next = latter                latter = latter.next            cur = cur.next                if former != None:            cur.next = former        if latter  != None:            cur.next = latter                return dummy_head.next
Java代码:

  1. public class Solution {  
  2.      //use the fast and slow pointer to get the middle of a ListNode  
  3.      ListNode getMiddleOfList(ListNode head) {  
  4.         ListNode slow = head;  
  5.         ListNode fast = head;  
  6.         while(fast.next!=null&&fast.next.next!=null) {  
  7.             slow = slow.next;  
  8.             fast = fast.next.next;  
  9.         }  
  10.         return slow;  
  11.     }  
  12.       
  13.     public ListNode sortList(ListNode head) {  
  14.         if(head==null||head.next==null) {  
  15.             return head;  
  16.         }  
  17.         ListNode middle = getMiddleOfList(head);  
  18.         ListNode next   = middle.next;  
  19.             middle.next = null;  
  20.         return mergeList(sortList(head), sortList(next));  
  21.     }  
  22.       
  23.     //merge the two sorted list  
  24.     ListNode mergeList(ListNode a, ListNode b) {  
  25.         ListNode dummyHead = new ListNode(-1);  
  26.         ListNode curr = dummyHead;  
  27.         while(a!=null&&b!=null) {  
  28.             if(a.val<=b.val) {  
  29.                 curr.next=a;a=a.next;  
  30.             } else {  
  31.                 curr.next=b;b=b.next;  
  32.             }  
  33.             curr  = curr.next;  
  34.         }  
  35.         curr.next = a!=null?a:b;  
  36.         return dummyHead.next;  
  37.     }  
  38. }  

转载地址:http://bmbvb.baihongyu.com/

你可能感兴趣的文章
在多级存储体系中,“Cache-主存”结构的作用是解决( )的题目。----腾讯2014研发笔试卷
查看>>
C++ 实现 0-1 背包问题
查看>>
指针数组 数组指针 指针函数 函数指针
查看>>
对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )
查看>>
字符串常量放在只读存储区
查看>>
#define 和 typedef 的区别
查看>>
不属于冯诺依曼体系结构必要组成部分是:
查看>>
有1000亿条记录,每条记录由url,ip,时间组成,设计一个系统能够快速查询以下内容(程序设计题)
查看>>
最大堆---实现一个简化的搜索提示系统。给定一个包含了用户query的日志文件,对于输入的任意一个字符串s,输出以s为前缀的在日志中出现频率最高的前10条query。
查看>>
拓扑排序
查看>>
已知n阶矩阵A的行列式满足|A|=1,求|A^(-1)|(A^(-1)表示A的逆矩阵)=?
查看>>
已知一对夫妇有两个孩子,如果知道有一个是男孩,那么两个都是男孩的概率?
查看>>
视图包含下列结构是不可以更新的
查看>>
可能返回 null 的 SQL 语句
查看>>
以下关于STL的描述中,错误的有
查看>>
假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找5。下面____不可能是键的检查序列。
查看>>
给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
查看>>
设二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序____。
查看>>
将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是____。
查看>>
IP地址、子网掩码、网络号、主机号、网络地址、主机地址
查看>>