日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

143. Reorder List 重排链表

發布時間:2024/5/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 143. Reorder List 重排链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個單鏈表 L:L0→L1→…→Ln-1→Ln ,
將其重新排列后變為: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

示例 1:

給定鏈表 1->2->3->4, 重新排列為 1->4->2->3.

示例 2:

給定鏈表 1->2->3->4->5, 重新排列為 1->5->2->4->3.

">

給定一個單鏈表?L:L0→L1→…→Ln-1→Ln ,

將其重新排列后變為: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

示例?1:

給定鏈表 1->2->3->4, 重新排列為 1->4->2->3.

示例 2:

給定鏈表 1->2->3->4->5, 重新排列為 1->5->2->4->3.

尋找鏈表中點 + 鏈表逆序 + 合并鏈表

注意到目標鏈表即為將原鏈表的左半端和反轉后的右半端合并后的結果。

這樣我們的任務即可劃分為三步:

  • 找到原鏈表的中點(參考「876. 鏈表的中間結點」)。

    • 我們可以使用快慢指針來 O(N)O(N)O(N) 地找到鏈表的中間節點。
  • 將原鏈表的右半端反轉(參考「206. 反轉鏈表」)。

    • 我們可以使用迭代法實現鏈表的反轉。
  • 將原鏈表的兩端合并。

    • 因為兩鏈表長度相差不超過 111,因此直接合并即可。
  • Code

    class Solution:def middleNode(self, head: ListNode) -> ListNode:slow = fast = headwhile fast.next and fast.next.next:slow = slow.nextfast = fast.next.nextreturn slowdef reverseList(self, head: ListNode) -> ListNode:prev, curr = None, headwhile curr:nextTemp = curr.nextcurr.next = prevprev = currcurr = nextTempreturn prevdef mergeList(self, l1: ListNode, l2: ListNode):while l1 and l2:l1Tmp = l1.nextl2Tmp = l2.nextl1.next = l2l1 = l1Tmpl2.next = l1l2 = l2Tmpdef reorderList(self, head: ListNode) -> None:"""Do not return anything, modify head in-place instead."""if not head:returnmiddle = self.middleNode(head)l1, l2 = head, middle.nextmiddle.next = Nonel2 = self.reverseList(l2)self.mergeList(l1, l2)

    復雜度分析

    • 時間復雜度:O(N)O(N)O(N),其中 NNN 是鏈表中的節點數。

    • 空間復雜度:O(1)O(1)O(1)

    總結

    以上是生活随笔為你收集整理的143. Reorder List 重排链表的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。