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; }
原文地址:https://www.cnblogs.com/lightwindy/p/9795768.html
时间: 2024-10-04 21:43:55