【程序员面试金典】面试题 02.04. 分割链表
题目
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5 输出: 3->1->2->10->5->5->8
思路
使用两个链表分别存小和大于等于的目标数的链表,然后连接两个链表。
代码
时间复杂度:O(n)
空间复杂度:O(1)
class Solution { public: ListNode* partition(ListNode* head, int x) { ListNode *head1 = new ListNode(0); ListNode *head2 = new ListNode(0); ListNode *h1 = head1, *h2 = head2; while (head) { if (head->val < x) { h1->next = head; h1 = h1->next; } else { h2->next = head; h2 = h2->next; } head = head->next; } h1->next = head2->next; h2->next = nullptr; return head1->next; } };