原题链接:#148 Sort List
要求:
给一个单向链表排序,要求时间复杂度为O(nlogn)且空间复杂度为O(1)。
单向链表定义如下:
class ListNode{ int val; ListNode next; ListNode(int x){ this.val = x; } }
难度:中等
分析:
若没有时间复杂度及空间复杂度的限制,解法将会很多。譬如先遍历一遍链表,将其所有元素放在一个数组内,以任一种排序算法排序后重新生成单向链表,比如最简单的冒泡。这种思路并非不可取,毕竟出于解决问题的角度它体现了一种转化的思想,把链表操作转化为数组操作并用开发人员自己最熟悉且用起来最舒服的算法排序并能切实解决问题,并不能全盘否定。这种解决方案的时间复杂度为O(n2),空间复杂度为O(n)。
题目加上了时间和空间两方面的限制,就要求我们优化一下算法了。同时,既然参数是链表,要求返回值也是链表,实在没有必要使用其他的数据结构来回转换。既满足时间复杂度要求又不需要O(n)辅助数据结构的,考虑采用归并排序算法。
各种排序算法的时间复杂度和空间复杂度比较:
图片来自:vincent-cws
解决方案:
Java - 384ms
public ListNode sortList(ListNode head) { if(head==null||head.next==null){ return head; } int nodeSum = 0; ListNode tmp = head; while(tmp!=null){ tmp = tmp.next; nodeSum++; } tmp = head; for(int i=1; i<nodeSum/2; i++){ tmp=tmp.next; } ListNode l1 = head; //将原链表分拆为两个子链表,分别排序然后合并 ListNode l2 = tmp.next; tmp.next=null; ListNode result = merge(sortList(l1), sortList(l2)); return result; } public ListNode merge(ListNode l1, ListNode l2){ ListNode head = new ListNode(0); ListNode cursor = head; while(l1!=null&&l2!=null){ if(l1.val<l2.val){ cursor.next=l1; l1 = l1.next; }else{ cursor.next=l2; l2=l2.next; } cursor = cursor.next; } if(l1!=null){ cursor.next = l1; }else { cursor.next = l2; } return head.next; }
相关推荐
1.1常数级链表排序Sort a linked list in O(n log n) time using constant space complexity.
在Java中,我们可以创建一个`ListNode`类表示链表节点,然后编写一个`sortList(ListNode head)`方法来实现归并排序。`ListNode`类应包含数据域和指向下一个节点的指针。`sortList`方法首先检查链表是否为空或只有一...
leetcode题库 LeetCode-PHP 坚持每天做算法题 (๑╹ヮ╹๑)ノ Studying makes me happy 文件夹 Array 数组 Backtracking 回溯算法 Binary Search 二分查找 Bit Manipulation 位运算 Breadth First Search 广度优先...
Python的内置函数`sorted()`和`list.sort()`可以方便地对数据进行排序,但理解其内部机制对于优化和自定义排序算法至关重要。 2. **搜索算法**:二分查找、深度优先搜索(DFS)和广度优先搜索(BFS)等是解题的关键...
利用java中Array对象的sort方法排序,使得整个数组呈升序状态 - 再利用两段取点相加的sum与target比较 - 若大于target,则后结点前移,sum变小 - 若小于target,则前结点后移,sum变大 逐个试,向中间逼近...
1. **排序算法**:在LeetCode中,常见的排序算法有快速排序、归并排序、插入排序、冒泡排序、堆排序等。Go语言中的sort包提供了基本的排序接口,可以帮助你轻松实现这些算法。 2. **搜索算法**:包括二分查找、深度...
例如,在解决搜索和排序问题时,Python内置的`list`数据结构和相关的操作函数如`sort()`、`append()`等,能快速实现各种功能。 接着,我们来看数据结构。在LeetCode中,常见的数据结构包括数组、链表、栈、队列、树...
- **排序算法**:快速排序、归并排序、堆排序等,Python的`sorted()`函数和`list.sort()`方法也是常用工具。 - **搜索算法**:二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等,用于处理查找和遍历问题。 ...
排序链表 (LeetCode #148) **题目描述**: 给定一个链表的头结点 `head`,要求对链表进行排序,并返回排序后的链表。 **解题思路**: 本题可以采用多种方法来解决,但最常用的是归并排序的思想。归并排序通过不断...
- **插入排序(Insertion Sort)**: 构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 - **归并排序(Merge Sort)**: 采用分治法,将已有序的子序列合并,得到完全有序的序列。 - **...
本题目聚焦于Python语言,具体是LeetCode的第148题——“排序链表”。这个题目的目标是给定一个链表,将其元素按照非递减顺序进行排序。 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下...
3. 排序与查找:Python内置的排序函数`sorted()`和`list.sort()`可以快速对数据进行排序,为后续处理提供便利。二分查找等高级查找技巧也是解决问题的常用手段,例如在“寻找旋转排序数组中的最小值”等题目中。 4....
- Sort Colors: 给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 - Combinations: 从n个不同元素中取出k个元素的组合。 - ...
此外,Python的内置排序函数`sorted()`和`list.sort()`能快速对数组进行排序。 链表问题是Python中常见的题目,如“反转链表”(LeetCode第206题)。Python虽然没有内置链表数据结构,但可以通过定义类来实现。链表...
leetcode 答案 leetcode Day 1 两数之和: 1。 考虑两层嵌套循环 2。 用dictionary以及 enumerate 函数 def twoSum1(self, nums: List[int], target: int) -> List[int]: dct ={} for index, number in enumerate...
sort--排序 stackqueue--栈和队列 string--串 tree--树 leetcode_agorithm leetcode算法示例题解 数据机构 线性表 线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,...
Collections.sort(List,Comparator) 对列表进行排序 反向链表(给定链表反向部分的长度) ListNode start = pre.next; ListNode then = start.next; //key part of reversing given length linkedlist for(int i =...
insertion-sort-list 树 binary-tree-postorder-traversal 树 binary-tree-preorder-traversal 链表 linked-list-cycle-ii 链表 linked-list-cycle 链表 copy-list-with-random-pointer 复杂度 single-number 动态...
排序算法,如"快速排序"(Quick Sort),在Python中可以直观地展示分治思想。搜索算法,如"二分查找"(Binary Search),则是Python高效解决问题的经典案例。 在`LeetCode_Python-master`中,每个题目都有清晰的...
sort--排序 stackqueue--栈和队列 string--串 tree--树 leetcode_agorithm leetcode算法示例题解 数据机构 线性表 线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,...