——核心思路:使用分治的思想进行求解,先将链表分成一个个最小的单个节点(单个节点就一定有序),然后再进行合并成一个个有序的子链表
对链表进行排序,使用分治的思路,将链表拆分为一个个节点,然后进行合并,
示例:
分 1,3,2,4,5 --> 1 3 2 4 5
合 1,3 2,4 5 --> 1,3 2,4,5 --> 1,2,3,4,5
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类 the head node
# @return ListNode类
#
class Solution:
def sortInList(self, head: ListNode) -> ListNode:
# 对链表进行排序,使用分治的思路,将链表拆分为一个个节点,然后进行合并,
# 分 1,3,2,4,5 --> 1 3 2 4 5
# 合 1,3 2,4 5 --> 1,3 2,4,5 --> 1,2,3,4,5
if head == None or head.next == None:
return head
# 使用快慢指针找中间位置进行切分
slow = head
mind = head.next
fast = head.next.next
while fast != None and fast.next != None:
slow = slow.next
mind = slow.next
fast = fast.next.next
# 将慢指针的next指针置为空,拆分成两个子链
slow.next = None
# 递归调用进行切分
return self.merge(self.sortInList(head), self.sortInList(mind))
# 这个合并方法中的两个链表都是有序的,将两个有序链表进行合并然后return
def merge(self, left: ListNode, right: ListNode) -> ListNode:
if left == None:
return right
if right == None:
return left
dummy = ListNode(-1) # 定义一个链表的头节点
p = dummy
# 两个链表都不为空,判断每个链表头节点哪个val值较小
while left != None and right != None:
if left.val <= right.val:
tmp = left
left = left.next
p.next = tmp
p = p.next
else:
tmp = right
right = right.next
p.next = tmp
p = p.next
# right还有剩余
if left == None:
p.next = right
if right == None:
p.next = left
return dummy.next

京公网安备 11010502036488号