LeetCode 86. Partition List

1. 题目描述

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.

2. 解题思路

本质上, 就是拿到一个链表, 将链表的值与一个给定的值比较, 分割成大于或者小于该值的两个链表, 然后再将这两个链表连接即可。

3. code

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode Gre(0), Let(0), myhead(0);
        ListNode * preG = &Gre, *preL = &Let, *pre = &myhead;
        ListNode * pCur = head, *pCurG = preG->next, *pCurL = preL->next;
        while (pCur){
            if (pCur->val < x){
                pCurL = pCur;
                pre->next = pCur->next;
                pCur = pre->next;

                pCurL->next = nullptr;
                preL->next = pCurL;
                preL = preL->next;
            }
            else{
                pCurG = pCur;
                pre->next = pCur->next;
                pCur = pre->next;

                pCurG->next = nullptr;
                preG->next = pCurG;
                preG = preG->next;
            }
        }

        preL->next = Gre.next;
        return Let.next;
    }
};

4. 大神解法

一样的思路

ListNode *partition(ListNode *head, int x) {
    ListNode node1(0), node2(0);
    ListNode *p1 = &node1, *p2 = &node2;
    while (head) {
        if (head->val < x)
            p1 = p1->next = head;
        else
            p2 = p2->next = head;
        head = head->next;
    }
    p2->next = NULL;
    p1->next = node2.next;
    return node1.next;
}

你可能感兴趣的:(LeetCode)