问题描述:
Sort a linked list using insertion sort.
原问题链接:https://leetcode.com/problems/sort-list/
问题分析
有时候,往往是一些看似简单的问题描述 ,其解决方法越麻烦。这里问题描述确实简单,对于一个链表来说,我们需要寻找一种时间复杂度为O(NlogN)的排序法。对于数组来说,要找到这种时间复杂度的方法有好几种,比如说归并排序,快速排序,堆排序等。这些都是建立在基于数组的索引访问很方便的基础之上的。
可是对于链表来说,这又是一个要命的问题。它最方便的访问法就是只能从头往后一个个的访问下去。如果要访问到其中的某个索引位置则相对慢很多。看来我们需要从上述的几种方法中找一种对于索引访问比较少,这样使得方法的性能没有太大影响的才行。
我们可以考虑归并排序,它是递归的将一组元素划分成两个部分,一直到无法继续划分位置。然后在递归返回的时候将相邻的两个部分给合并起来。在这里,我们可以将链表首先划分成两个部分。这里可以采用前面快慢指针的手法。这样就得到了两个链表。
然后我们再针对两个链表进行合并。而合并链表的手法在之前的一些方法里也有过讨论,我们就是建立一个临时节点,然后将它们两个链表按照大小往里面加。同时每次也移动新链表里元素的节点。
这样,把这两个点解决之后,就好办了。我们可以得到如下的详细代码实现:
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode sortList(ListNode head) { if(head == null || head.next == null) return head; ListNode fast = head, slow = head, pre = null; while(fast != null && fast.next != null) { pre = slow; slow = slow.next; fast = fast.next.next; } pre.next = null; ListNode first = sortList(head); ListNode second = sortList(slow); return merge(first, second); } private ListNode merge(ListNode first, ListNode second) { ListNode dummy = new ListNode(0); ListNode pre = dummy; while(first != null && second != null) { if(first.val < second.val) { pre.next = first; first = first.next; } else { pre.next = second; second = second.next; } pre = pre.next; } if(first != null) pre.next = first; if(second != null) pre.next = second; return dummy.next; } }
相关推荐
Sort Colors LeetCode 125 Valid Palindrome LeetCode 167 Two Sum II - Input array is sorted LeetCode 344 Reverse String LeetCode 345 Reverse Vowels of a String 2 字符串 编号 题目 LeetCode 3 Longest ...
- 数组和链表:LeetCode中的基础题目通常涉及数组和链表操作,如“两数之和”(Two Sum)和“反转链表”(Reverse Linked List)。C++的`std::vector`和`std::list`是常用的容器,能方便地实现这些操作。 - 树形...
- Java中的`Collections.sort()`方法用于对List接口的实现进行排序,`Arrays.sort()`则适用于数组。 2. **搜索算法**: - 二分查找:在已排序的数组中寻找目标值,Java实现通常使用循环或递归。 - 广度优先搜索...
list:链表相关题目 stack:栈相关题目 queue:队列相关题目 string:字符串处理相关题目 tree:树相关题目 divide Conquer: 分治法相关题目 dynamic Programming:动态规划 graph:图论 greedy:贪心算法 recursion:...
leetcode 答案 leetcode Day 1 两数之和: 1。 考虑两层嵌套循环 2。...用dictionary以及 ...List[int], ...List[int]: ...List[int], ...List[int]: ...temp.sort() i=0 j=len(nums)-1 while i<j>target: j=j-1 elif (temp
最大公共字符串leetcode leetcode 数组 链表 二叉树 位操作 判断字符串的顺序排列 给定一个字符串数组,将字谜组合在一起。 例如,给定:["eat", "tea", "tan", "ate", "nat", "bat"], public class Solution { ...
C++标准库提供了一系列容器类,如std::vector、std::list、std::stack、std::queue、std::set、std::map等,它们为实现这些数据结构提供了便利。熟练掌握这些数据结构及其操作,是解决LeetCode题目的基础。 三、...
4. **数组与容器**:在 C++ 中,数组是最基础的序列数据结构,但标准模板库(STL)提供了更强大的容器,如 vector、list、deque 和 set 等。这些容器提供了便利的增删改查操作,以及迭代器进行遍历。 5. **字符串...
list 2017.06.13 打卡[LeetCode 200. Number of Islands], BFS 2017.06.14 打卡[LeetCode 3. Longest Substring Without Repeating Characters], N/A 2017.06.15 打卡[LeetCode 407. Trapping Rain Water II], BFS/...
例如,自定义链表节点类可以优化"Linked List"相关问题的性能,而模板可以用于创建通用的算法,如"Merge Sort"或"Quick Sort"。 此外,解题过程中还可能涉及到内存管理和异常处理,这些都是C++特有的挑战。通过阅读...
此外,对于数据结构,C++提供了标准模板库(STL),其中包括了容器(如vector、list、set、map)和算法,这些都是解决LeetCode问题时的利器。 例如,对于数组和链表问题,我们可能会用到迭代器、指针操作以及动态...
Sort & Search # Name Difficulty Solution index 1 直接插入 easy python :heart_suit: 2 简单选择排序 easy python :heart_suit: 3 冒泡排序 easy python :heart_suit: 4 希尔 easy python :heart_suit: 5 快排...
leetcode中325题python leetcode 以 参考 和 Hash相关 1_两数之和 387_字符串中的第一个唯一字符 链表操作 2 ...删除链表的倒数第N个节点 ...sort-list 234 回文链表 palindrome-linked-list 双指针遍历/滑动
1. 冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等都是常见的排序算法,Python的内置sorted()函数和list.sort()方法可以快速完成排序任务。 2. 查找算法包括线性查找、二分查找、哈希查找等。二分查找...
Python的内置数据结构如list、dict、set、tuple等在解题时经常被用到。例如,你可以学习如何高效地使用这些数据结构来实现二分查找、回溯搜索、动态规划等算法。 2. **算法**:包括排序算法(快速排序、归并排序、...
例如,Reverse Linked List(反转链表)和Intersection of Two Linked Lists(两个链表的交集)等题目,都需要对链表进行操作。 3. 栈与队列:栈具有后进先出(LIFO)特性,队列则遵循先进先出(FIFO)原则。例如,...
LeetCodeLeetCode solutions(Java)树Minimum Depth of Binary Tree栈evaluate-reverse-polish-notation穷举max-points-on-a-line链表sort-list排序insertion-sort-list树binary-tree-postorder-traversal树binary-...
frequecy_sort.py: height_checker.py: Jewels_and_stones.py: last_stone_weight.py: Linked_list_cycle.py: long_pressed_name.py: max_69_number.py: max_array_sum_after_negations.py: max_depth_n_ary...
2. **C++语言特性**:在C++中,可以利用STL(标准模板库)中的容器(如vector、list、set、map)和算法来简化代码。例如,`std::sort`用于排序,`std::lower_bound`或`std::upper_bound`进行区间查找。同时,C++的...
2. **STL(Standard Template Library)**:STL 提供了容器(如 vector、list、set、map)、迭代器、算法和函数对象等组件,是 C++ 解决算法问题的强大工具。例如,可以使用 `std::sort` 进行排序,`std::find` 进行...