题目: 用nlog(n) 的时间复杂度,实现链表的排序
思路: 列表或者数组可以直接用归并排序来做,但是链表没法做,因为链表只有顺序关系,很难定位到一个元素(中点)。在这里需要对归并排序做一些改动
tip:
如何定位到链表中点?———双指针法
双指针法。没错,就是之前判断链表有环的方法。一个指针走一步,一个指针走两步,当快指针走到头时,慢指针的前一个节点就是中点元素
找到中点元素就好办了! 归并!
class Solution:
'''
这段代码 太美了!!!! 赞
'''
def sortList(self, head: ListNode) -> ListNode:
if not head:
return None
return self.mergeSort(head)
def mergeSort(self, node:ListNode) -> ListNode:
# 递归出口
if not node.next:
return node
p1 = node
p2 = node
# 找到中点 如何找到链表中点? 还是双指针法
cute = None
while p1 and p1.next:
cute = p2
p2 = p2.next
p1 = p1.next.next
# 分割成两段
cute.next = None
l1 = self.mergeSort(node)
l2 = self.mergeSort(node)
# merge
return self.mergeTowLists(l1,l2)
def mergeTowLists(self,l1,l2):
# 做一个虚假的头
pHead = ListNode(-1)
temp = pHead
while l1 and l2:
if l1.val < l2.val:
temp.next = l1
l1 = l1.next
else:
temp.next = l2
l2 = l2.next
temp = temp.next
if l1:
temp.next = l1
if l2:
temp.next = l2
return pHead.next