重新排序 python 中的链表
Reorder linked list in python
我试图解决这个问题。但是,我有超过时间限制。
任何人都可以在没有时间限制的情况下解决这个问题吗?
这是问题。
给你一个单向链表的头部。该列表可以表示为:
L0 → L1 → … → Ln - 1 → Ln
将列表重新排序为以下形式:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
您不能修改列表节点中的值。只有节点本身可以更改。
这是我的实现。但是,超过了时间限制。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
temp=head
temp2=None
if temp.next is None:
pass
elif temp.next.next is None:
pass
else:
while temp.next:
temp2=temp
while temp2.next:
prev=temp2
temp2=temp2.next
temp2.next=temp.next
temp.next=temp2
prev.next=None
if temp2.next.next is None:
break
if temp2.next.next.next is None:
break
temp=temp.next.next
LeetCode 上有一个 "Discuss" 部分,您可以在其中找到一些解决方案和解释。
一个可能的解决方案:
class Solution:
def reorderList(self, head: ListNode) -> None:
if not head:
return head
# find mid point
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# reverse the second half in-place
# slow.next: the start point of reverse
head2 = None
curr = slow.next
slow.next = None
while curr:
next = curr.next
curr.next = head2
head2 = curr
curr = next
# merge in-place
first, second = head, head2
while second:
first.next, first = second, first.next
second.next, second = first, second.next
return
我试图解决这个问题。但是,我有超过时间限制。 任何人都可以在没有时间限制的情况下解决这个问题吗? 这是问题。 给你一个单向链表的头部。该列表可以表示为:
L0 → L1 → … → Ln - 1 → Ln
将列表重新排序为以下形式:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
您不能修改列表节点中的值。只有节点本身可以更改。 这是我的实现。但是,超过了时间限制。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
temp=head
temp2=None
if temp.next is None:
pass
elif temp.next.next is None:
pass
else:
while temp.next:
temp2=temp
while temp2.next:
prev=temp2
temp2=temp2.next
temp2.next=temp.next
temp.next=temp2
prev.next=None
if temp2.next.next is None:
break
if temp2.next.next.next is None:
break
temp=temp.next.next
LeetCode 上有一个 "Discuss" 部分,您可以在其中找到一些解决方案和解释。
一个可能的解决方案:
class Solution:
def reorderList(self, head: ListNode) -> None:
if not head:
return head
# find mid point
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# reverse the second half in-place
# slow.next: the start point of reverse
head2 = None
curr = slow.next
slow.next = None
while curr:
next = curr.next
curr.next = head2
head2 = curr
curr = next
# merge in-place
first, second = head, head2
while second:
first.next, first = second, first.next
second.next, second = first, second.next
return