143. Reorder List 重排链表
生活随笔
收集整理的這篇文章主要介紹了
143. Reorder List 重排链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個單鏈表 L:L0→L1→…→Ln-1→Ln ,
將其重新排列后變為: L0→Ln→L1→Ln-1→L2→Ln-2→…
將其重新排列后變為: 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 重排链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode Algorithm 1
- 下一篇: 925. Long Pressed Na