力扣算法题—086分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
1 #include "_000库函数.h" 2 3 struct ListNode { 4 int val; 5 ListNode *next; 6 ListNode(int x) : val(x), next(NULL) {} 7 }; 8 9 10 //感觉用两条链表可能会更简单点,但内存会大点, 11 //的确,内存多了点 12 class Solution { 13 public: 14 ListNode* partition(ListNode* head, int x) { 15 ListNode* p1 = new ListNode(-1);//用来存放小于x的数 16 ListNode* p2 = new ListNode(-1);//用来存放其他数字 17 ListNode* q1 = p1; 18 ListNode* q2 = p2; 19 while (head) {//无头结点 20 ListNode* q = new ListNode(0); 21 q->val = head->val; 22 if (head->val < x) { 23 q1->next = q; 24 q1 = q; 25 } 26 else { 27 q2->next = q; 28 q2 = q; 29 } 30 head = head->next; 31 } 32 q1->next = p2->next;//组合为一个链表 33 return p1->next;//不需要头结点 34 } 35 }; 36 37 //用插入法,在原链表上操作 38 class Solution { 39 public: 40 ListNode* partition(ListNode* head, int x) { 41 ListNode* p = new ListNode(-1); 42 p->next = head; 43 head = p;//加一个头结点 44 ListNode* pro, *cur; 45 pro = p;//要插入的位置 46 cur = p;//移动的位置 47 p = p->next; 48 while (p) { 49 if (p->val < x) { 50 ListNode* q = new ListNode(0); 51 q->val = p->val; 52 cur->next = p->next;//删除该数 53 p = cur->next; 54 q->next = pro->next;//插入 55 pro->next = q; 56 if (cur == pro) 57 cur = cur->next; 58 pro = q; 59 } 60 else { 61 p = p->next; 62 cur = cur->next; 63 } 64 } 65 return head->next; 66 } 67 }; 68 69 void T086() { 70 Solution s; 71 vector<int>v; 72 ListNode *head = new ListNode(0); 73 ListNode *p = head; 74 v = { 1,4,3,2,5,2 }; 75 for (auto a : v) { 76 ListNode *q = new ListNode(0); 77 q->val = a; 78 p->next = q; 79 p = q; 80 } 81 p = head->next; 82 while (p) { 83 cout << p->val << "->"; 84 p = p->next; 85 } 86 cout << endl; 87 p = s.partition(head->next,3); 88 while (p) { 89 cout << p->val << "->"; 90 p = p->next; 91 } 92 cout << endl; 93 }