求问老师leetcode 的148 题要怎么做到constant space complexity

来源:5-7 更多和链表相关的问题

慕前端6301706

2019-02-08

我的想法是merge sort 但是这样的话需要new 一个新的listnode 再进行merge的话应该space就超过了 不知道老师有没有什么提示

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

写回答

1回答

liuyubobobo

2019-02-09

new一个ListNode仍然是O(1)的时间复杂度:)


对于链表来说,如果给定两个有序链表,进行和并,是可以非常简单的用O(1)的空间搞定的。这是链表比数组方便的地方:)具体可以先尝试一下这个问题:https://leetcode.com/problems/merge-two-sorted-lists/


对链表进行归并排序,真正有些小技巧的,是进行”二分“的过程。但是最坏情况下,使用O(n)的时间进行遍历,了解整个链表有多少元素(假设为n),之后在遍历前n/2个元素,也能找到中间节点。


另一个方法是使用双指针。快慢两个指针。快指针每次挪动两步,慢指针每次挪动一步,最后,慢指针对应的位置就是中间位置:)


我在我的Leetcode解题代码仓中,实现了一个基于链表的归并排序,可以参考:)(C++源码)

https://github.com/liuyubobobo/Play-Leetcode/blob/master/0148-Sort-List/cpp-0148/main.cpp


加油!:)

0
2
liuyubobobo
回复
慕前端6301706
在看懂逻辑的基础上,尝试自己用Java实现一下,(或者自己翻译成Java代码),收获会更大哦:)加油!:)
2019-02-09
共2条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程