Løsning:Partitionsliste

Dette er en del af en række Leetcode-løsningsforklaringer (indeks). Hvis du kunne lide denne løsning eller fandt den nyttig, synes godt om dette indlæg og/eller stem op mit løsningsindlæg på Leetcodes fora.

Leetcode-problem #86 (Medium ):Partitionsliste

Beskrivelse:


(Hop til :Løsningsidé || Kode :JavaScript | Python | Java | C++ )

Eksempler:

Begrænsninger:

Idé:


(Hop til :Problembeskrivelse || Kode :JavaScript | Python | Java | C++ )

Den nemmeste ting at gøre her er at oprette separate linkede lister for de forreste og bagerste dele af listen, vi ønsker at returnere. For at opnå det, bør vi først oprette nogle dummy-hoveder (fdum, bdum ), opret derefter pointere for de aktuelle noder hver af for-, bag- og hovedlisterne (front, back, curr ).

Så kan vi blot iterere gennem hovedlisten og sy hver node sammen til enten front eller tilbage , afhængigt af nodens værdi.

Når vi når slutningen, mangler vi bare at sy de to underlister sammen, og sørg for at lukke enden af ​​tilbage , og derefter retur vores nye liste, minus dummy-hovedet.

Implementering:

Der er kun mindre forskelle mellem koden for alle fire sprog.

Javascript-kode:


(Hop til :Problembeskrivelse || Løsningsidé )

var partition = function(head, x) {
    let fdum = new ListNode(0), bdum = new ListNode(0),
        front = fdum, back = bdum, curr = head
    while (curr) {
        if (curr.val < x)front.next = curr, front = curr
        else back.next = curr, back = curr
        curr = curr.next
    }
    front.next = bdum.next, back.next = null
    return fdum.next
};

Python-kode:


(Hop til :Problembeskrivelse || Løsningsidé )

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        fdum, bdum = ListNode(0), ListNode(0)
        front, back, curr = fdum, bdum, head
        while curr:
            if curr.val < x:
                front.next = curr
                front = curr
            else:
                back.next = curr
                back = curr
            curr = curr.next
        front.next, back.next = bdum.next, None
        return fdum.next

Java-kode:


(Hop til :Problembeskrivelse || Løsningsidé )

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode fdum = new ListNode(0), bdum = new ListNode(0),
                 front = fdum, back = bdum, curr = head;
        while (curr != null) {
            if (curr.val < x) {
                front.next = curr;
                front = curr;
            } else {
                back.next = curr;
                back = curr;
            }
            curr = curr.next;
        }
        front.next = bdum.next;
        back.next = null;
        return fdum.next;
    }
}

C++-kode:


(Hop til :Problembeskrivelse || Løsningsidé )

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode *fdum = new ListNode(0), *bdum = new ListNode(0),
                 *front = fdum, *back = bdum, *curr = head;
        while (curr) {
            if (curr->val < x) front->next = curr, front = curr;
            else back->next = curr, back = curr;
            curr = curr->next;
        }
        front->next = bdum->next, back->next = nullptr;
        return fdum->next;
    }
};