leetcode 148. 排序链表
leetcode 148 链表的排序
给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表.
进阶:
你可以在 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
解题说明:
本题直接考虑归并排序,首先利用快慢指针,其中快指针是慢指针的两倍,找出链表的中点,进行分割;然后利用分治算法思想进行分治合并处理,其中。合并过程可以采用递归的方式,也可以采用迭代的方式。当链表太长,不能采用迭代方式
代码如下
class Solution(object):
def sortList(self, head):
if head is None or head.next is None:
return head
slow = head
quick = head.next #便于分割链表
while (quick is not None) and (quick.next is not None):
quick = quick.next.next
slow = slow.next
#链表的后半部分
new_list = slow.next
slow.next = None #链表的前半部分
linked_left = self.sortList(head)
linked_right = self.sortList(new_list)
#链表合并
return self.linked_merge(linked_left, linked_right)
def linked_merge(self, linked_left, linked_right):
if linked_left is None: return linked_right
if linked_right is None: return linked_left
if linked_left.val >= linked_right.val:
linked_right.next = self.linked_merge(linked_left, linked_right.next)
return linked_right
else:
linked_left.next = self.linked_merge(linked_left.next, linked_right)
return linked_left

其中,基于迭代方式的链表合并:
def linked_merge2(header1, header2):
header = LinkedNode(0)
mov = header
while (header1 is not None) and (header2 is not None):
if header1.val > header2.val:
mov.next = LinkedNode(header2.val)
header2 = header2.next
else:
mov.next = LinkedNode(header1.val)
header1 = header1.next
mov = mov.next
while header1 is not None:
mov.next = LinkedNode(header1.val)
header1 = header1.next
mov = mov.next
while header2 is not None:
mov.next = LinkedNode(header2.val)
header2 = header2.next
mov = mov.next
return header.next
posted on 2021-10-29 10:56 random_boy 阅读(48) 评论(0) 收藏 举报
浙公网安备 33010602011771号