LeetCode演算法解析之“重排連結串列”問題
阿新 • • 發佈:2020-12-21
技術標籤:資料結構與演算法專輯連結串列資料結構演算法leetcodejava
給定一個單鏈表 L:L0→L1→…→Ln-1→Ln , 將其重新排列後變為: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
示例 1:
示例 2:
解題思路如下:
因為連結串列不支援下標訪問,所以我們無法隨機訪問連結串列中任意位置的元素。
因此比較容易想到的一個方法是,我們利用線性表儲存該連結串列,然後利用線性表可以下標訪問的特點,直接按順序訪問指定元素,重建該連結串列即可。
class Solution {
public void reorderList(ListNode head) {
if (head == null) {
return;
}
List<ListNode> list = new ArrayList<ListNode>();
ListNode node = head;
while (node != null) {
list.add(node);
node = node.next;
}
int i = 0, j = list.size() - 1;
while (i < j) {
list.get(i).next = list.get(j);
i++;
if (i == j) {
break;
}
list.get(j).next = list.get(i);
j--;
}
list.get(i).next = null;
}
}
複雜度分析
時間複雜度
空間複雜度:O(N)O(N),其中 NN 是連結串列中的節點數。主要為線性表的開銷。