1. 程式人生 > >Leetcode 143:重排連結串列(最詳細解決方案!!!)

Leetcode 143:重排連結串列(最詳細解決方案!!!)

給定一個單鏈表 LL*0→*L*1→…→*Ln-1→*L*n ,
將其重新排列後變為: L*0→*LnL*1→*Ln-1→L*2→*Ln-2→…

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例 1:

給定連結串列 1->2->3->4, 重新排列為 1->4->2->3.

示例 2:

給定連結串列 1->2->3->4->5, 重新排列為 1->5->2->4->3.

解題思路

我首先想到的思路是通過兩個stack將中間元素的左邊和右邊分別入棧。

stack1
: 1 2 stack2: 4 5 mid: 3

然後先彈出stack1,在彈出stack2,最後彈出mid即可。現在的問題變成,我們怎麼獲得mid?我們可以通過兩個指標,這兩個指標,一個快lat=lat.next.next,一個慢pre=pre.next.next

          pre             lat
 1 -> 2 -> 3 -> 4 -> 5 -> null

但是這種做法沒有符合題意,題目要求是在原有的連結串列上操作。怎麼辦呢?其實我們得到中間節點後問題已經快要解決了。我們可以將後面的連結串列reverse,然後每個一個元素去除前面的連結串列節點和後面的連結串列節點,如下:

1 -> 2 -> null
5 -> 4 -> 3 -> null

程式碼如下:

class Solution:
    def reorderList(self, head):
        """
        :type head: ListNode
        :rtype: void Do not return anything, modify head in-place instead.
        """
        if head == None or head.next == None:
            return
pre = head lat = head.next while lat != None and lat.next != None: pre = pre.next lat = lat.next.next p = pre.next pre.next = None # reverse cur = None while p != None: q = p.next p.next = cur cur = p p = q pre = head while pre != None and cur != None: tmp = cur.next cur.next = pre.next pre.next = cur pre = pre.next.next cur = tmp

如有問題,希望大家指出!!!

相關推薦

Leetcode 143:重排連結串列詳細解決方案

給定一個單鏈表 L:L*0→*L*1→…→*Ln-1→*L*n , 將其重新排列後變為: L*0→*Ln→L*1→*Ln-1→L*2→*Ln-2→… 你不能只是單純的改變節點內部的值,而是需要實際的

Leetcode 206:反轉連結串列詳細解決方案

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代

Leetcode 328:奇偶連結串列詳細解決方案

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。 請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。

Leetcode 25:k個一組翻轉連結串列詳細解決方案

給出一個連結串列,每 k 個節點一組進行翻轉,並返回翻轉後的連結串列。 k 是一個正整數,它的值小於或等於連結串列的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。 示例 : 給定這個連結串列:1->2->3->4-

Leetcode 279:完全平方數詳細解決方案

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。 示例 1: 輸入: n = 12 輸出: 3 解釋: 12 = 4 + 4 + 4. 示例 2: 輸入: n = 13

Leetcode 18:四數之和詳細解決方案

給定一個包含 n 個整數的陣列 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重複的四元組。 注意: 答案中不可以包含重複的四元組。 示例:

Leetcode 2:兩數相加詳細解決方案

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2

Leetcode 27:移除元素詳細解決方案

給定一個數組 nums 和一個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。 元素的順序可以改變。你不需要考慮陣列中超出新長度後面的

Leetcode 15:三數之和詳細解決方案

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 **注意:**答案中不可以包含重複的三元組。 例如, 給定陣列 nums = [-1, 0,

Leetcode 1:兩數之和詳細解決方案

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 +

Leetcode 141:環形連結串列詳細的解法

給定一個連結串列,判斷連結串列中是否有環。 進階: 你能否不使用額外空間解決此題? 解題思路 一個最簡單的做法就是將連結串列反轉,我們看連結串列反轉後有什麼問題,關於連結串列反轉可以看這篇Leetcode 206:反轉連結串列(最詳細解決方案!!!)。 1 -> 2

Leetcode 92:反轉連結串列 II詳細解決方案

反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉。 說明: 1 ≤ m ≤ n ≤ 連結串列長度。 示例: 輸入: 1->2->3->4->5->NU

Leetcode 237:刪除連結串列中的節點詳細解決方案

請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個連結串列 – head = [4,5,1,9],它可以表示為: 4 -> 5

Leetcode 82:刪除排序連結串列中的重複元素 II詳細解決方案

給定一個排序連結串列,刪除所有含有重複數字的節點,只保留原始連結串列中 沒有重複出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸

Leetcode 147:對連結串列進行插入排序詳細解決方案

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序

Leetcode 23:合併K個排序連結串列詳細的解法

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4-

Leetcode ---- 143.重排連結串列

題目: 給定一個單鏈表 L:L0→L1→…→Ln-1→Ln , 將其重新排列後變為: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。 示例 1: 給定連結串列 1->2->3->4,

143. 重排連結串列中等,鏈12.25

給定一個單鏈表 L:L0→L1→…→Ln-1→Ln , 將其重新排列後變為: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。 示例 1: 給定連結串列 1->2->3->4,

Leetcode 209:長度小的子陣列詳細解決方案

給定一個含有 n 個正整數的陣列和一個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的子陣列。如果不存在符合條件的子陣列,返回 0。 示例: 輸入: [2,3,1,2,4,3], s = 7 輸出: 2 解釋: 子陣列 [4,3] 是該條件下的

Leetcode 125:驗證迴文串詳細解決方案

給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。 示例 1: 輸入: "A man, a plan, a canal: Panama" 輸出: true 示例 2: