【排序链表】
题目描述
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路使用归并排序,归并排序分为两步,1.找到待排序链表的中间节点(使用快慢指针法,leetcode 876题)2.合并两个有序链表(leetcode 21题),因此本题相当于结合这两步来实现链表排序。
# Definition for singly-linked list.class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: def sortList(self, head: ListNode) -> ListNode: # if not head or not head.next:# if head == None or head.next == None: return head slow = head#快慢指针法找到链表中点 fast = head while fast.next and fast.next.next: slow = slow.next fast = fast.next.next right = slow.next # print(right.val) slow.next = None #这一句的原因是 需要对中点前的链表进行割断处理 l1 = self.sortList(head)#递归保证l1和l2为有序链表 l2 = self.sortList(right) return self.mergeTwoLists(l1,l2)# 合并两个有序链表 def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1 and not l2: return None if not l1: return l2 if not l2: return l1 head = head1 = ListNode(0) 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 if not l1 : head.next = l2 if not l2 : head.next = l1 return head1.next
测试
if __name__ == "__main__": n1 = ListNode(4) n2 = ListNode(7) n3 = ListNode(6) n4 = ListNode(9) n5 = ListNode(12) m=n1 n1.next=n2 n2.next=n3 n3.next=n4 n4.next=n5 print('原链表的节点:') while m: print('节点%d的值:'%(m.val),m.val) m=m.next print('\n排序之后的节点:') s=Solution() s.sortList(n1) while n1: print('节点%d的值:'%(n1.val),n1.val) n1=n1.next#result原链表的节点:节点4的值: 4节点7的值: 7节点6的值: 6节点9的值: 9节点12的值: 12排序之后的节点:节点4的值: 4节点6的值: 6节点7的值: 7节点9的值: 9节点12的值: 12
点击左下角【阅读原文】查看leetcode官网本题描述
【往期文章回顾】链表
1. 剑指offer的python实现(1)-从尾到头打印链表的值
2. 剑指offer的python实现(6)-反转链表
3. 剑指offer的python实现(15)-链表中倒数第k个结点
4. 剑指offer的python实现(16)-合并两个排序的链表
5. 剑指offer的python实现(18)-删除链表中重复的结点
6. 剑指offer的python实现(20)-链表中的环的入口接点
7. 剑指offer的python实现(23)-两个链表的第一个公共结点
8. 剑指offer的python实现(27)-复杂链表的复制
9. 剑指offer的python实现(29)-二叉搜索树与双向链表
10. leetcode-19. 删除链表的倒数第N个节点
11. leetcode的python实现-(206)反转链表和(92)反转链表II
12. leetcode的python实现-(876)链表的中间结点
二叉树
1. 剑指offer的python实现(3)-重建二叉树
2. 剑指offer的python实现(4)-二叉树层级遍历
3. 剑指offer的python实现(5)-二叉搜索树的后序遍历序列
4. 剑指offer的python实现(21)-二叉树的镜像
5. 剑指offer的python实现(22)-树的子结构
6. 剑指offer的python实现(25)-二叉树中和为某一值的路径
7. 剑指offer的python实现(30)-二叉树的深度
8. 剑指offer的python实现(33)-平衡二叉树
9. 剑指offer的python实现(38)-二叉树的下一个结点
10. 剑指offer的python实现(39)-对称的二叉树
11. 剑指offer的python实现(40)-二叉搜索树的第k个结点
12. leetcode-二叉树的前、中、后序遍历和层序遍历python实现
13. leetcode-N叉树的前、后序遍历和层序遍历python实现
14. leetcode(98)-验证二叉搜索树
15. leetcode(235)python实现- 二叉搜索树的最近公共祖先
数组
1. leetcode(560)python实现-和为k的子数组
2. 剑指offer的python实现(46)-构建乘积数组
3. 剑指offer的python实现(35)-把数组排成最小的数
4. 剑指offer的python实现(32)-连续子数组的最大和
5. 剑指offer的python实现(31)-数组中出现次数超过一半的数字
6. 剑指offer的python实现(17)-调整数组奇偶数顺序
7. 剑指offer的python实现(9)-旋转数组的最小数字
8. 找出一维数组中的重复值-python实现
字符串
1. 剑指offer的python实现(36)-第一个只出现一次的字符位置
2. 剑指offer的python实现(42)-左旋转字符串
3. 剑指offer的python实现(45)-把字符串转换成整数
栈和队列
1. 剑指offer的python实现(7)-用两个栈实现队列
2. 剑指offer的python实现(8)-栈的压入弹出序列
3. 剑指offer的python实现(28)-包含min函数的栈
递归和循环
1. 剑指offer的python实现(10)-斐波那契数列
2. 剑指offer的python实现(11)-跳台阶
3. 剑指offer的python实现(12)-变态跳台阶
排序算法
1. 冒泡排序、选择排序、插入排序、快速排序的python实现
2. 归并排序、堆排序的python实现
3. 计数排序、桶排序、基数排序的python实现
长按二维码关注公众号,获取更多内容
点击留言