题解 | #链表的奇偶重排#
链表的奇偶重排
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;
}
查看11道真题和解析