zoukankan      html  css  js  c++  java
  • 5 分隔链表(725)

    作者: Turbo时间限制: 1S章节: DS:数组和链表

    晚于: 2020-07-08 12:00:00后提交分数乘系数50%

    截止日期: 2020-07-15 12:00:00

    问题描述 :

    给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。

    每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。

    这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。

    返回一个符合上述规则的链表的列表。

    举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]

    示例 1:

    输入: 

    root = [1, 2, 3], k = 5

    输出: [[1],[2],[3],[],[]]

    解释:

    输入输出各部分都应该是链表,而不是数组。

    例如, 输入的结点 root 的 val= 1, root.next.val = 2, oot.next.next.val = 3, 且 root.next.next.next = null。

    第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。

    最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。

    示例 2:

    输入: 

    root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3

    输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]

    解释:

    输入被分成了几个连续的部分,并且每部分的长度相差不超过1.前面部分的长度大于等于后面部分的长度。

    说明:

    root 的长度范围: [0, 1000].

    输入的每个节点的大小范围:[0, 999].

    k 的取值范围: [1, 50].

    可使用以下代码,完成其中的splitListToParts函数,其中形参root指向无头结点单链表,k为分成的结果链表的数目,返回的vector中包含k个头指针,分别指向一个结果链表。

    输入说明 :

    首先输入链表长度len,然后输入len个整数,以空格分隔。

    再输入k。

    输出说明 :

    输出格式见范例,每行输出一个链表的信息。

    输入范例 :

    3
    1 2 3
    5

    输出范例:

    head-->1-->tail
    head-->2-->tail
    head-->3-->tail
    head-->tail
    head-->tail
    #include<iostream>
    #include<vector>
    using namespace std;
    
    struct ListNode
    {
        int val;
        ListNode *next;
        ListNode() : val(0), next(NULL) {}
        ListNode(int x) : val(x), next(NULL) {}
        ListNode(int x, ListNode *next) : val(x), next(next) {}
    };
    class Solution
    {
    public:
        vector<ListNode*> splitListToParts(ListNode* root, int k)
        {
    
            vector<ListNode*> res(k,NULL);
            if(root==NULL)  return res;
            int len=0;
            ListNode *p=root;
            while(p)
            {
                len++;
                p=p->next;
            }
    
            int s=len/k, extra=len%k;  
            ListNode *cur=root;
    
            for(int i=0;i<k;i++)
            {
                ListNode *head=cur;
                for(int j=0;j<s+(i<extra?1:0)-1;j++)
                    if(cur) 
                        cur=cur->next;
                if(cur)
                {
                    ListNode *pre=cur;
                    cur=cur->next;
                    pre->next=NULL;
                }
                res[i]=head;
            }
            return res; 
        }
    };
    ListNode *createByTail()
    {
        ListNode *head;
        ListNode *p1,*p2;
        int n=0,num;
        int len;
        cin>>len;
        head=NULL;
        while(n<len && cin>>num)
        {
            p1=new ListNode(num);
            n=n+1;
            if(n==1)
                head=p1;
            else
                p2->next=p1;
            p2=p1;
        }
        return head;
    }
    void  display(vector<ListNode *> lnVec )
    {
        for(int i=0; i<lnVec.size(); i++)
        {
            ListNode *p;
            p=lnVec[i];
            cout<<"head-->";
            while(p!= NULL)
            {
                cout<<p->val<<"-->";
                p=p->next;
            }
            cout<<"tail
    ";
        }
    }
    int main()
    {
        vector<int> G;
        int k;
        ListNode* head = createByTail();
        cin>>k;
        vector<ListNode*> lnVec=Solution().splitListToParts(head,k);
        display(lnVec);
        return 0;
    }
    
    ///思路:先求出链表的长度,然后求出链表的平均长度,以及余数。
    由于题目规定任意两部分的长度不能超过1,
    所以余数依次给排在前面的平均长度+1即可
  • 相关阅读:
    (转载)C++ string中find() ,rfind() 等函数 用法总结及示例
    UVA 230 Borrowers (STL 行读入的处理 重载小于号)
    UVA 12100 打印队列(STL deque)
    uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
    uva 1592 Database (STL)
    HDU 1087 Super Jumping! Jumping! Jumping!
    hdu 1176 免费馅饼
    HDU 1003 Max Sum
    转战HDU
    hust 1227 Join Together
  • 原文地址:https://www.cnblogs.com/zmmm/p/13616563.html
Copyright © 2011-2022 走看看