题目: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
题解思路:
方法:双指针就行分割 遍历链表,把小于x的链表L1进行串起来,大于x的链表L2串起来,最后L1的下一个结点就是L2的头结点。
推荐函数代码一:
class Solution { public: void reorderList(ListNode* head) { if(!head||!head->next) { return; } ListNode *fast=head; ListNode *slow=head; while(fast->next&&fast->next->next) { fast=fast->next->next; slow=slow->next; } fast=slow->next; slow->next=NULL; ListNode *pre=NULL; while(fast) { ListNode *n=fast->next; fast->next=pre; pre=fast; fast=n; } slow=head; fast=pre; while(slow) { if(fast) { ListNode *n=slow->next; slow->next=fast; ListNode *nn=fast->next; fast->next=n; slow=n; fast=nn; } else { break; } } } };函数代码二:
class Solution { public: ListNode* partition(ListNode* head, int x) { ListNode *dummy1=new ListNode(0); ListNode *dummy2=new ListNode(0); ListNode *p1=dummy1; ListNode *p2=dummy2; p1->next=head; p2->next=head; ListNode *p=head; while(p) { if(p->val<x) { p1->next=p; p1=p1->next; } else { p2->next=p; p2=p2->next; } p=p->next; } p2->next=NULL; p1->next=dummy2->next; return dummy1->next; } };