心路历程:
1、这道题从通过的角度是可以直接用模拟的方式做,不过这道题考察的其实是归并排序。
2、归并排序的方式:
在归的时候只需要研究怎么把链表对半分割即可,递的时候才考虑链表的两两合并问题。
这里面一些细节在于分割要维持左闭右开的循环不变量,以及fast放置到tail的原理。
解法:归并排序
class Solution:
def sortList(self, head: ListNode) -> ListNode:
def merge(head1, head2): # 合并两个有序链表 Leetcode 21.
dumy = ListNode()
t1, t2, t3 = head1, head2, dumy
while t1 or t2: # 核心就是每一步选择哪个节点
if not