zoukankan      html  css  js  c++  java
  • LeetCode(86):分隔链表

    Medium!

    题目描述:

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

    你应当保留两个分区中每个节点的初始相对位置。

    示例:

    输入: head = 1->4->3->2->5->2, x = 3
    输出: 1->2->2->4->3->5

    解题思路:

    这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。那么可以想到的一种解法是首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可

    C++解法一:

     1 class Solution {
     2 public:
     3     ListNode *partition(ListNode *head, int x) {
     4         ListNode *dummy = new ListNode(-1);
     5         dummy->next = head;
     6         ListNode *pre = dummy, *cur = head;;
     7         while (pre->next && pre->next->val < x) pre = pre->next;
     8         cur = pre;
     9         while (cur->next) {
    10             if (cur->next->val < x) {
    11                 ListNode *tmp = cur->next;
    12                 cur->next = tmp->next;
    13                 tmp->next = pre->next;
    14                 pre->next = tmp;
    15                 pre = pre->next;
    16             } else {
    17                 cur = cur->next;
    18             }
    19         }
    20         return dummy->next;
    21     }
    22 };

    这种解法的链表变化顺序为:

    1 -> 4 -> 3 -> 2 -> 5 -> 2 

    1 -> 2 -> 4 -> 3 -> 5 -> 2 

    1 -> 2 -> 2 -> 4 -> 3 -> 5

    此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可。

    C++解法二:

     1 class Solution {
     2 public:
     3     ListNode *partition(ListNode *head, int x) {
     4         if (!head) return head;
     5         ListNode *dummy = new ListNode(-1);
     6         ListNode *newDummy = new ListNode(-1);
     7         dummy->next = head;
     8         ListNode *cur = dummy, *p = newDummy;
     9         while (cur->next) {
    10             if (cur->next->val < x) {
    11                 p->next = cur->next;
    12                 p = p->next;
    13                 cur->next = cur->next->next;
    14                 p->next = NULL;
    15             } else {
    16                 cur = cur->next;
    17             }
    18         }
    19         p->next = dummy->next;
    20         return newDummy->next;
    21     }
    22 };

    此种解法链表变化顺序为:

    Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2 

    New:

    Original: 4 -> 3 -> 2 -> 5 -> 2 

    New:   1

    Original: 4 -> 3 -> 5 -> 2 

    New:   1 -> 2

    Original: 4 -> 3 -> 5 

    New:   1 -> 2 -> 2

    Original: 

    New:   1 -> 2 -> 2 -> 4 -> 3 -> 5 

  • 相关阅读:
    C#控件刷新
    [转载] 尺度不变特征变换匹配算法
    C++ windows 多线程 互斥锁
    堆栈内存申请,以及32位程序内存上限
    dumpbin检查Dll
    CV_Assert
    Linux复习
    操作系统复习
    P/NP问题
    程序
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9159367.html
Copyright © 2011-2022 走看看