[LeetCode] 86. Partition List 劃分鏈表
阿新 • • 發佈:2018-10-16
ren mat original node link current 節點 aud amp
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; }
[LeetCode] 86. Partition List 劃分鏈表