leetcode 148. 排序链表
https://leetcode-cn.com/problems/sort-list/
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def sortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
def merge(left,right):
#定义头节点
if left.val<right.val:
p_merge=left
left=left.next
else:
p_merge=right
right=right.next
tmp_head=p_merge
#比较合并
while left!=None and right!=None:
if left.val<right.val:
p_merge.next=left
p_merge=p_merge.next
left=left.next
else:
p_merge.next=right
p_merge=p_merge.next
right=right.next
#剩余的放到末尾
while left!=None:
p_merge.next=left
p_merge=p_merge.next
left=left.next
while right!=None:
p_merge.next=right
p_merge=p_merge.next
right=right.next
return tmp_head
def merge_sort(phead):
if phead==None or phead.next==None:
return phead
#找到中间节点
slow=phead
fast=phead
while fast.next!=None and fast.next.next!=None:
fast=fast.next.next
slow=slow.next
#中间节点为slow,剪成两个节点递归分治
next_node=slow.next
slow.next=None
left_part=merge_sort(phead)
right_part=merge_sort(next_node)
#合并
return merge(left_part,right_part)
return merge_sort(head)