排序链表

中英题面

  在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

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

  示例 1:

  输入: 4->2->1->3
  输出: 1->2->3->4

  Example 1:

  Input: 4->2->1->3
  Output: 1->2->3->4

  示例 2:

  输入: -1->5->3->4->0
  输出: -1->0->3->4->5

  Example 2:

  Input: -1->5->3->4->0
  Output: -1->0->3->4->5  

算法

  直接套用归并排序的思想,为了方便与节省空间,牺牲了一些常数时间。
  时间复杂度:
    O(NlogN)
  空间复杂度:
    O(1)

代码

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6
 7 class Solution:
 8     def sortList(self, head):
 9         """
10         :type head: ListNode
11         :rtype: ListNode
12         """
13         if (not head):
14             return None
15         if (not head.next):
16             return head
17         hen = tai = tail = head
18         while (tai.next):
19             tai = tai.next
20             if (tai.next):
21                 tail = tail.next
22             else:
23                 break
24             tai = tai.next
25         self.adjust(head, tai)
26         hen = tail.next
27         tail.next = None
28         self.adjust(head, tail)
29         self.adjust(hen, tai)
30         self.sortList(head)
31         self.sortList(hen)
32         i = head
33         while (hen):
34             if (i.next):
35                 if (i.next.val > hen.val):
36                     hen.next, i.next, hen = i.next, hen, hen.next
37                 i = i.next
38             else:
39                 i.next = hen
40                 break
41         return head
42
43     def adjust(self, head, tail):
44         i = head
45         while (i.next):
46             if (head.val > i.next.val):
47                 head.val, i.next.val = i.next.val, head.val
48             if (tail.val < i.next.val):
49                 tail.val, i.next.val = i.next.val, tail.val
50             i = i.next

原文地址:https://www.cnblogs.com/Efve/p/9062365.html

时间: 2024-10-09 00:57:40

排序链表的相关文章

LintCode 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素每个元素只留下一个. 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null 分析:先开始的时候是想着head 和head->next作为基准 但其实pre和cur更合适 /** * Definition of ListNode * class ListNode { * public: * int

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link

剑指Offer15 合并两个已排序链表

1 /************************************************************************* 2 > File Name: 15_MergeTwoSortList.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 15时49分47秒 6 ********************************

【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

[082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. For example, Given 1->2->

求n个排序链表的交集

题目大致意思是 给出n个排序list,每个list只有两个方法 (1)bool goNext(); 判断是否有下一个元素,没有元素返回false, 有元素返回true (2)int next(); 返回下一个链表的值 求这个n个排序链表的交集,也就是每个链表都有的元素 本题的基本思路是 求n个排序链表的交集

【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题目大意 给定一个升序的单链表.将它转换成一颗高度平衡的二叉树 解题思路 解法

链表——(循环和递归)合并两个排序链表

题目:合并两个递增排序链表,使新链表仍然按照递增排序. 方法一: 基于递归的方法,链表first和链表second各有m和n个结点,新链表的头结点为两个链表中头结点较小 的一个,当找到该头结点时(假设为first的头结点),仍需对first的m-1个结点和second的n个结点合并. 可以看出,子问题和原问题相同,因此可以利用递归解决. 代码如下: /** * Definition for singly-linked list. * public class ListNode { * int v

LintCode-删除排序链表中的重复数字 II

给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素. 您在真实的面试中是否遇到过这个题? Yes 样例 给出1->2->3->3->4->4->5->null,返回1->2->5->null 给出1->1->1->2->3->null,返回 2->3->null 标签 Expand 分析:因为是排序链表,所以每次判断和后面的是不是一样就行,一样就一直把这个相同的遍历到不同的点 代码: /**

合并k个排序链表

题目 合并k个排序链表,并且返回合并后的排序链表.尝试分析和描述其复杂度. 样例 给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null 解题 两两合并 合并ab得到c 合并cd得到e /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val =

链表操作 -- 未排序链表的处理问题

问题: 删除未排序链表中的重复元素. 解答: 1)最朴素的方法就是将链表排序,然后遍历并删除其中的重复元素.这种方法的时间复杂度依赖于排序的过程. 在此,我们要思考一下,找到并且删除链表中的重复元素真的需要排序过程吗? 2)如何才能在不排序的情况下找到重复元素? 最朴素的方法就是处理每个节点的时候,遍历剩余的节点,查看其中是否有重复的元素.这种方法的时间复杂度较高,O(n2). 有没有更好的算法或是数据结构来帮助我们降低这个时间复杂度?这种查找某个元素的存在性问题,可以借助于hash表来快速的实