题解 | #链表的奇偶重排#

链表的奇偶重排

https://www.nowcoder.com/practice/02bf49ea45cd486daa031614f9bd6fc3

这道题还是非常简单的~因为复杂度限制非常宽松,所以可以使用非常笨的方法去实现啦~

简而言之,题目希望我们将链表中修改成奇节点+偶节点的格式。我们采取的方法还是像之前那样首先遍历链表获取链表长度,然后根据奇偶关系得到奇数数组的长度应该是len/2+1(len为奇数)或者len/2(len为偶数),偶数数组的长度应该为len/2。

然后我们根据index的奇偶将链表中的值存入数组中,然后新建一个链表就好了~

我这里误解了题目的意思,写了一个归并排序哈哈哈

int getlen(struct ListNode* head)
{
    int len = 0;
    while(head!=NULL)
    {
        len++;
        head = head->next;
    }
    return len;
}
struct ListNode* createnode(int val)
{
    struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(node!=NULL)
    {
        node->val = val;
        node->next = NULL;
    }
    return node;
}
void merge(int arr[],int left,int mid,int right)
{
    int len1 = mid-left+1;
    int len2 = right - mid;
    int arr1[len1];
    for(int i=0;i<len1;i++)
    {
        arr1[i] = arr[left+i];
    }
    int arr2[len2];
    for(int i=0;i<len2;i++)
    {
        arr2[i] = arr[mid+1+i];
    }
    int out[right-left+1];
    int pos = 0;
    int pos_1 = 0;
    int pos_2 = 0;
    while(pos_1<len1&&pos_2<len2)
    {
        if(arr1[pos_1]<arr2[pos_2])
        {
            out[pos] = arr1[pos_1];
            pos_1++;
        }
        else if(arr1[pos_1]>=arr2[pos_2])
        {
            out[pos] = arr2[pos_2];
            pos_2++;
        }
        pos++;
    }
    while(pos_1<len1)
    {
        out[pos] = arr1[pos_1];
        pos_1++;    
        pos++;
    }
    while(pos_2<len2)
    {
        out[pos] = arr2[pos_2];
        pos_2++;    
        pos++;
    }
    for(int i=0;i<right-left+1;i++)
    {
        arr[left+i] = out[i];
    }
}
void mergesort(int arr[],int left,int right)
{
    if(left>=right)
    {
        return ;
    }
    int mid = (right+left)/2;
    mergesort(arr, left, mid);
    mergesort(arr, mid+1,right);
    merge(arr,left,mid,right);
}
struct ListNode* oddEvenList(struct ListNode* head ) {
    // write code here
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* para_head = head;
    int len = getlen(para_head);
    int odd_len, even_len;
    if(len%2==0)
    {
        odd_len = len/2;
        even_len = len/2;
    }
    else   
    {
        odd_len = len/2+1;
        even_len = len/2;
    }
    int odd_arr[odd_len];
    int even_arr[even_len];
    int pos = 1;
    int pos_even = 0;
    int pos_odd =  0;
    while(head!=NULL)
    {
        if(pos%2==0)
        {
            even_arr[pos_even] = head->val;
            pos_even++;
        }
        else   
        {
            odd_arr[pos_odd] = head->val;
            pos_odd++;
        }
        pos++;
        head = head->next;
    }
    for(int i=0;i<odd_len;i++)
    {
        printf("%d ",odd_arr[i]);
    }printf("\n");
    // mergesort(odd_arr, 0, odd_len-1);
    // mergesort(even_arr,0, even_len-1);
    struct ListNode* newhead = createnode(odd_arr[0]);
    struct ListNode* out = newhead;
    for(int i=1;i<odd_len;i++)
    {
        struct ListNode* node = createnode(odd_arr[i]);
        newhead->next = node;
        newhead = newhead->next;
    }
    for(int i=0;i<even_len;i++)
    {
        struct ListNode* node = createnode(even_arr[i]);
        newhead->next = node;
        newhead = newhead->next;
    }
    return out;
}

全部评论

相关推荐

头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务