2020-11-04 将单向链表按某值划分为左边小,中间相等,右边大的形式

题目描述

给定一个链表,再给定一个整数 pivot,请将链表调整为左部分都是值小于 pivot 的节点,中间部分都是值等于 pivot 的节点, 右边部分都是大于 pivot 的节点。

除此之外,对调整后的节点顺序没有更多要求。

输入描述:

第一行两个整数 n 和 pivot,n 表示链表的长度。

第二行 n 个整数 ai 表示链表的节点。

输出描述:

请在给定的函数内返回链表的头指针。

示例1

输入

复制

5 3
9 0 4 5 1

输出

复制

1 0 4 5 9

备注:

1≤n≤1000000
−1000000≤ai,pivot≤1000000

 两种解法,一种是利用数组,采用荷兰国旗题型的方法,一种是利用三个链表分别存放小于等于和大于的节点,最后对是三个链表进行归并。

方法一:利用数组

list_node * list_partition(list_node * head, int pivot)
{
    //在下面完成代码
    vector<list_node*> data;
    for(list_node* cur = head; cur != nullptr; cur = cur->next) {
        data.push_back(cur);
    }
    int lessIndex = 0, curIndex = 0, moreIndex = data.size() - 1;
    while(curIndex <= moreIndex) {
        if(data[curIndex]->val > pivot) {
            swap(data[curIndex]->val, data[moreIndex]->val);
            moreIndex --;
        } else if(data[curIndex]->val < pivot) {
            swap(data[curIndex]->val, data[lessIndex]->val);
            lessIndex ++;
            curIndex ++;
        } else {
            curIndex ++;
        }
    }
    int i = 0;
    for(i = 1; i < data.size(); i ++) {
        data[i - 1]->next = data[i];
    }
    data[i - 1] == nullptr;
    return data[0];
}

方法二:利用三个链表

list_node * list_partition(list_node * head, int pivot)
{
    //在下面完成代码
    
    list_node* lessHead = nullptr;
    list_node* lessEnd = nullptr;
    list_node* equalHead = nullptr;
    list_node* equalEnd = nullptr;
    list_node* moreHead = nullptr;
    list_node* moreEnd = nullptr;
    list_node* temp = nullptr;
    while(head != nullptr) {
        temp = head->next;
        head->next = nullptr;

        if(head->val < pivot) {
            if(lessHead == nullptr) {
                lessHead = head;
                lessEnd = lessHead;
            } else {
                lessEnd->next = head;
                lessEnd = lessEnd->next;
            }
        } else if(head->val > pivot) {
            if(moreHead == nullptr) {
                moreHead = head;
                moreEnd = moreHead;
            } else {
                moreEnd->next = head;
                moreEnd = moreEnd->next;
            }
        } else {
            if(equalHead == nullptr) {
                equalHead = head;
                equalEnd = equalHead;
            } else {
                equalEnd->next = head;
                equalEnd = equalEnd->next;
            }
        }
        head = temp;
    }
    if(lessHead != nullptr) {
        lessEnd->next = equalHead;
        equalEnd = equalEnd == nullptr ? lessEnd : equalEnd;
    }
    if(equalEnd != nullptr) {
        equalEnd->next = moreHead;
    } 
    return lessHead != nullptr ? lessHead : equalHead != nullptr ? equalHead : moreHead;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值