给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x
的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1-4-3-2-5-2, x = 3 输出: 1-2-2-4-3-5
题目分析
- 直接思路是第一次遍历找到中间节点,并且划分为左右两边,然后再重新遍历链表元素,按大小分类到两边去。
- 但这样要来回遍历链表,还要不停的交换节点很麻烦,换个逆向思路:既然是一个链表分成两个区域,不就相当于两个链表合成一个区域
- 因此,即构造两个链表,遍历原链表元素,分类接在两个链表上。
- 遍历结束合成两个链表。
题解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class Solution { public: ListNode* partition(ListNode* head, int x) {
ListNode lefthead(0); ListNode* left=&lefthead; ListNode righthead(0); ListNode* right=&righthead;
while(head!=NULL) { if(head-val<x) { left-next=head; left=left-next; } else { right-next=head; right=right-next; } head=head-next;
} right-next=NULL; left-next=righthead.next; return lefthead.next;
} };
|