LeetCode-143. 重排链表【栈 递归 链表 双指针】
- 题目描述:
- 解题思路一:找到中点,翻转后半段链表。然后依次改变指针顺序即可。
- 解题思路二:0
- 解题思路三:0
题目描述:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]
示例 2:
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]
提示:
链表的长度范围为 [1, 5 * 104]
1 <= node.val <= 1000
解题思路一:找到中点,翻转后半段链表。然后依次改变指针顺序即可。
问:循环条件 while head2.next 为什么不能写成 while head2?
答:如果链表长度为偶数,例如链表由 [1,2,3,4]四个节点组成,那么找中间节点并反转后,我们得到的两个链表分别为 head=[1,2,3] 和 head2=[4,3]。注意它俩都包含节点 3。如果写成 while head2,会导致最后一轮循环中 3 指向它自己。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def middleNode(self, head: Optional[ListNode]) -> None:
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
def reverseList(self, head: Optional[ListNode]) -> None:
pre, cur = None, head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return pre
def reorderList(self, head: Optional[ListNode]) -> None:
mid = self.middleNode(head)
head2 = self.reverseList(mid)
# copy_head = head
while head2.next:
tmp1 = head.next
tmp2 = head2.next
head.next = head2
head2.next = tmp1
head = tmp1
head2 = tmp2
# print(copy_head) 最终只需地址对应即可
时间复杂度:O(n)
空间复杂度:O(1)
解题思路二:0
时间复杂度:O(n)
空间复杂度:O(n)
解题思路三:0
时间复杂度:O(n)
空间复杂度:O(n)