https://leetcode.cn/problems/LGjMqU/
https://leetcode.cn/problems/reorder-list/
难度:☆☆☆
题目:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
输入:head = [1,2,3,4]
输出:[1,4,2,3]
方法:链表,列表(数组)+双指针
Python
时间复杂度:O(n),n为链表中的节点数。
空间复杂度:O(n),n为链表中的节点数。
class Solution:
def reorderList(self, head: ListNode) -> None:
lst, p = [], head
# 将链表的每个节点装入列表中,注意不是val,是直接将节点装进去
# 此时列表中储存的节点,依然后next属性
while p:
lst.append(p)
p = p.next
left, right = 0, len(lst) - 1
while left < right:
# 注意链表先把后一个的next指向好,再搞前一个
# 比如示例,先把4->2搞定,再搞1->4
# 如果先搞1->4,那么4就无法通过1来找到2在哪里了
lst[right].next = lst[left].next
lst[left].next = lst[right]
left += 1
right -= 1
# 链表结尾
lst[left].next = None
Java
时间复杂度:O(n),n为链表中的节点数。
空间复杂度:O(n),n为链表中的节点数。
class Solution {
public void reorderList(ListNode head) {
List<ListNode> lst = new ArrayList<>();
ListNode p = head;
while (p != null) {
lst.add(p);
p = p.next;
}
int left = 0, right = lst.size() - 1;
while (left < right) {
lst.get(right).next = lst.get(left).next;
lst.get(left).next = lst.get(right);
left++;
right--;
}
lst.get(left).next = null;
}
}