力扣算法题—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 }

 

posted @ 2019-04-21 16:14  自由之翼Az  阅读(152)  评论(0编辑  收藏  举报