[LeetCode] 148. Sort List_Middle tag: Linked List
2019-05-02 11:11 Johnson_强生仔仔 阅读(212) 评论(0) 编辑 收藏 举报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
这个题目有好几种做法,因为包含O(n*lg(n)) 的主要排序方法有三种, merger sort, quick sort, heap sort。
1. Merge sort
实际上是利用了分治的思想,找中点,然后两边分别排序,最后将它们merge起来即可。
找中点的程序可以参考[LeetCode] 876. Middle of the Linked List_Easy tag: Linked List。note: 注意找中点的时候,如果是偶数,应该选第一个
merge left, right的程序可以参考[LeetCode] 21. Merge Two Sorted Lists_Easy tag: Linked List。
code
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def findMiddle(self, head): slow, fast = head, head while fast: if fast.next is None or fast.next.next is None: return slow slow = slow.next fast = fast.next.next
def merge(self, l1, l2): dummy = ListNode(0) head = dummy while l1 and l2: if l1.val <= l2.val: head.next = l1 l1 = l1.next else: head.next = l2 l2 = l2.next head = head.next head.next = l1 if l1 else l2 return dummy.next def sortList(self, head: ListNode) -> ListNode: # merge sort . T: O(n * lg(n)) if head is None or head.next is None: return head middle = self.findMiddle(head) right = self.sortList(middle.next) middle.next = None left = self.sortList(head) return self.merge(left, right)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?