1. 程式人生 > 其它 >LeetCode演算法解析之“重排連結串列”問題

LeetCode演算法解析之“重排連結串列”問題

技術標籤:資料結構與演算法專輯連結串列資料結構演算法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 是連結串列中的節點數。

空間複雜度:O(N)O(N),其中 NN 是連結串列中的節點數。主要為線性表的開銷。