148. 排序链表
1.题目
2.官方的解决方案
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: ListNode) -> ListNode:
def merge(head1, head2): # 合并两个链表
dummyHead = ListNode(0)
tmp, tmp1, tmp2 = dummyHead, head1, head2
while tmp1 and tmp2:
if tmp1.val <= tmp2.val:
tmp.next = tmp1
tmp1 = tmp1.next
else:
tmp.next = tmp2
tmp2 = tmp2.next
tmp = tmp.next
if tmp1:
tmp.next = tmp1
elif tmp2:
tmp.next = tmp2
return dummyHead.next
if not head: # 处理空链表
return head
length = 0 # 计算链表长度
node = head
while node:
length += 1
node = node.next
dummyHead = ListNode(0, head) # 给链表增加哑结点
subLength = 1 # 表示每次需要排序的子链表的长度
while subLength < length:
pre, cur = dummyHead, dummyHead.next
while cur:
head1 = cur
for i in range(1, subLength): # cur指针移动sublength个长度
if cur.next:
cur = cur.next
else:
break
head2 = cur.next # 第二个子链表的开头
cur.next = None # 第一个子链表和第二个子链表之间断开
cur = head2 # cur指向第二个子链表
for i in range(1, subLength): # 从第二个子链表开始移动
if cur and cur.next:
cur = cur.next
else:
break
succ = None
if cur: # 如果没有到整个链表的末尾
succ = cur.next # 标记第三个子链表开头为succ
cur.next = None # 第二个子链表和第三个子链表之间断开
merged = merge(head1, head2) # 对两个链表进行排序
pre.next = merged # 将排序后的新链表接在头结点后面
while pre.next: # pre指向排序后的链表末尾
pre = pre.next
cur = succ # cur指向第三个子链表
subLength <<= 1 # 当第一个subLength在整个链表完成的时候,开始第二个subLength
return dummyHead.next