0
点赞
收藏
分享

微信扫一扫

LeetCode题解(0143):重排链表(Python)


题目:​​原题链接​​(中等)

标签:链表、链表-双指针、链表-快慢针

解法

时间复杂度

空间复杂度

执行用时

Ans 1 (Python)

O(N)

O(1)

140ms (17.17%)

Ans 2 (Python)

O(N)

O(1)

104ms (79.31%)

Ans 3 (Python)

O(N)

O(1)

104ms (79.31%)


LeetCode的Python执行用时随缘,只要时间复杂度没有明显差异,执行用时一般都在同一个量级,仅作参考意义。


解法一(双指针):

def reorderList(self, head: ListNode) -> None:
# 处理特殊情况
if not head or not head.next:
return

# 寻找链表中点
slow = fast = head
fast = fast.next.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next

# 翻转链表后半部分
curr = slow.next
while curr and curr.next:
now = ListNode(curr.next.val)
now.next = slow.next
slow.next = now
curr.next = curr.next.next

# 重排链表
node = head
while node != slow and slow.next:
now = ListNode(slow.next.val)
now.next = node.next
node.next = now
node = node.next.next
slow.next = slow.next.next

解法二(双指针,减少插入和删除的次数):

def reorderList(self, head: ListNode) -> None:
# 处理特殊情况
if not head or not head.next:
return

# 寻找链表中点
slow = fast = head
fast = fast.next.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next

# 移除后半部分链表
curr = slow.next
slow.next = None

# 翻转链表后半部分
reverse = None
while curr:
point = curr.next
curr.next = reverse
reverse = curr
curr = point

# 重排链表
while head and head.next:
point = reverse.next
reverse.next = head.next
head.next = reverse
head = head.next.next
reverse = point
if reverse:
head.next = reverse

解法三(修改链表中点处理方法):

def reorderList(self, head: ListNode) -> None:
# 处理特殊情况
if not head or not head.next:
return

# 寻找链表中点
slow = fast = head
while fast and fast.next:
slow, fast = slow.next, fast.next.next

# 移除后半部分链表
curr = slow.next
slow.next = None

# 翻转链表后半部分
reverse = None
while curr:
curr.next, reverse, curr = reverse, curr, curr.next

# 重排链表
while reverse:
reverse.next, head.next, head, reverse = head.next, reverse, head.next, reverse.next



举报

相关推荐

0 条评论