zoukankan      html  css  js  c++  java
  • 力扣算法题—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 }
  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10745573.html
Copyright © 2011-2022 走看看