• [LeetCode] 86. Partition List 划分链表


    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.

    Example:

    Input: head = 1->4->3->2->5->2, x = 3
    Output: 1->2->2->4->3->5

    给一个链表和一个x值,划分链表,把所有小于x值的节点都移到大于等于x值的前面,两部分的节点顺序不变。

    解法:维护两个queue,一个存小于x值的,一个存大于等于x值的,最后在把两个连在一起。记得把大于等于的最后加上null。

    Java:

    public ListNode partition(ListNode head, int x) {
        ListNode dummy1 = new ListNode(0), dummy2 = new ListNode(0);  //dummy heads of the 1st and 2nd queues
        ListNode curr1 = dummy1, curr2 = dummy2;      //current tails of the two queues;
        while (head!=null){
            if (head.val<x) {
                curr1.next = head;
                curr1 = head;
            }else {
                curr2.next = head;
                curr2 = head;
            }
            head = head.next;
        }
        curr2.next = null;          //important! avoid cycle in linked list. otherwise u will get TLE.
        curr1.next = dummy2.next;
        return dummy1.next;
    }
    

    Python:

    # Time:  O(n)
    # Space: O(1)
    class ListNode(object):
        def __init__(self, x):
            self.val = x
            self.next = None
    
        def __repr__(self):
            if self:
                return "{} -> {}".format(self.val, repr(self.next))
    
    class Solution(object):
        # @param head, a ListNode
        # @param x, an integer
        # @return a ListNode
        def partition(self, head, x):
            dummySmaller, dummyGreater = ListNode(-1), ListNode(-1)
            smaller, greater = dummySmaller, dummyGreater
    
            while head:
                if head.val < x:
                    smaller.next = head
                    smaller = smaller.next
                else:
                    greater.next = head
                    greater = greater.next
                head = head.next
    
            smaller.next = dummyGreater.next
            greater.next = None
    
            return dummySmaller.next
    

    C++:

    // Time:  O(n)
    // Space: O(1)
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *partition(ListNode *head, int x) {
            ListNode dummy_smaller{0};
            ListNode dummy_larger{0};
            auto smaller = &dummy_smaller;
            auto larger = &dummy_larger;
    
            while (head) {
                if (head->val < x) {
                    smaller->next = head;
                    smaller = smaller->next;
                } else {
                    larger->next = head;
                    larger = larger->next;
                }
                head = head->next;
            }
            smaller->next = dummy_larger.next;
            larger->next = nullptr;
    
            return dummy_smaller.next;
        }
    };
    

    C++:

    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;
    }
    

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    不用keytool,tomcat打开https
    sqlserver获取某一张表中的所有列中的最大长度
    不用keytool,tomcat打开https
    到底私钥和公钥哪个是用来加密 哪个是用来解密的
    空间支持php解压
    到底私钥和公钥哪个是用来加密 哪个是用来解密的
    sqlserver获取某一张表中的所有列中的最大长度
    数字签名(代码签名)流程
    功夫电影中非常经典(武术非常实用)
    数字签名(代码签名)流程
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9795768.html
Copyright © 2020-2023  润新知