力扣 leetcode 86. 分隔連結串列

Stig.Huang發表於2021-01-03

Topic:
給你一個連結串列和一個特定值 x ,請你對連結串列進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

Example:

輸入:head = 1->4->3->2->5->2, x = 3
輸出:1->2->2->4->3->5

思路:
整體的思路就是將連結串列按原序拆分為小的和大的兩個連結串列,最後合併

首先先設定兩個啞節點(便於邊界的判斷)
之後遍歷整個連結串列
若head的val小於x,則small的下一位變為head
small指標轉換為下一位(此時head的val)
同理
若head的val大於或等於於x,則big的下一位變為head
big指標指向下一位(此時head的val)
這樣兩個連結串列已經按照原來的順序
分別將小的儲存為了small
大的儲存為了big
遍歷結束後
將 big 的 next 指標清空(防止指向原來初始連結串列的節點)
同時將 small 的 next 指向L2的next 的節點(big連結串列真正的頭節點)
最後返回L1的next指標

Code:

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        L1 = small = ListNode(0)
        L2 =  big = ListNode(0)
        
        while head:
            if head.val < x:
                small.next = head
                small = small.next
            else:
                big.next = head
                big = big.next
            
            head = head.next

        big.next = None
        small.next = L2.next
        
        return L1.next

Result:

在這裡插入圖片描述

相關文章