【LeetCode】148. 排序链表
2023-09-14 09:13:24 时间
1 题目
2 思想
3 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None or head.next is None : # 如果就仅有一个节点
return head
mid = self.splitList(head)
left_head = self.sortList(head)
right_head = self.sortList(mid)
res = self.mergeList(left_head,right_head)
return res
# 根据快慢指针将一个链表一分为二
def splitList(self,head):
slow = fast = head
while(fast.next and fast.next.next):
fast = fast.next.next
slow = slow.next
tmp = slow.next
slow.next = None # 要断开
# 将链表一份为二
return tmp
# 合并两个链表
# 让这里的输入 head1 与 head2 不可能是None
def mergeList(self,head1,head2):
# 判断是否是特殊情况
if head1 is None and head2 is None:
return None
# 得到头结点
if head1.val <= head2.val:
start = head1
head1 = head1.next
else:
start = head2
head2 = head2.next
# 开始 merge
tail = start
while(head1 and head2):
if head1.val <= head2.val:
tail.next = head1
head1 = head1.next
else:
tail.next = head2
head2 = head2.next
tail = tail.next
if head1:
tail.next = head1
if head2:
tail.next = head2
# 返回合并后的头节点
return start
相关文章
- <leetcode刷题-数组> 【动态规划】【贪心算法】买卖股票的最佳时机
- 拒绝无脑刷LeetCode,你需要知道这些套路
- Leetcode 题目927-三等分0和1组成的数组
- LeetCode排序链表C++解法(详解)
- 刷LeetCode链表之前你需要掌握的设置结点技巧C++
- leetcode:92. 反转链表 II(C++)
- leetcode 141. 环形链表 js 实现
- LeetCode 141. 环形链表
- LeetCode 7. 整数反转
- LeetCode 242. 有效的字母异位词
- Leetcode No.147 对链表进行插入排序
- LeetCode-题库(8-9)
- leetcode 160. 相交链表 js 实现
- 【day10】LeetCode(力扣)刷题(注释详细)[707.设计链表][278.第一个错误的版本][98. 验证二叉搜索树]
- LeetCode | 删除链表的倒数第 N 个结点
- LeetCode周赛332,让我看看多少人大意翻车在了第二题?
- 使用Js怒刷LeetCode
- LeetCode 82:删除排序链表中的重复元素 II
- LeetCode-206-反转链表
- 【Leetcode】链表的深度拷贝——复制带随机指针的链表
- 【leetcode 206】 反转链表(简单)
- LeetCode 复制带随机指针的链表(C语言)
- 每日一道leetcode:6. N 字形变换
- LeetCode排列组合问题合集详解编程语言
- LeetCode 0109 有序链表转换二叉搜索树详解编程语言