描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足 0 \le n \le 10^50≤n≤105,节点中的值都满足 0 \le val \le 10000≤val≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
示例1
输入:
{1,2,3,4,5,6}
返回值:
{1,3,5,2,4,6}
说明:
1->2->3->4->5->6->NULL
重排后为
1->3->5->2->4->6->NULL
示例2
输入:
{1,4,6,3,7}
返回值:
{1,6,7,4,3} 说明: 1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3
备注:
链表长度不大于200000。每个数范围均在int内。
代码以及分析:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode oddEvenList (ListNode head) {
// write code here
ListNode cur=head;
ListNode odd=new ListNode(0); //奇数带头结点
ListNode oddp=odd;
ListNode even=new ListNode(0); //偶数带头结点
ListNode evenr=even;
int len=0;
while(cur!=null){
len++;
cur=cur.next;
}
cur=head; //重新回到头
ListNode temp=null;
for(int i=1;i<=len;i++){
//奇数点
if(i%2!=0){
temp=cur.next;
cur.next=null;
oddp.next=cur; //奇数链表当前指针
oddp=cur; //oddp始终指向奇数链表的表尾
}
else{
temp=cur.next;
cur.next=null;
evenr.next=cur; //偶数链表的当前指针
evenr=cur; //evner始终指向偶数链表的表尾
}
cur=temp; //返回原有的总链表
}
oddp.next=even.next; //奇数末尾节点接到偶数的头结点
return odd.next;
}
}
或者简约版(网上的)
原理一样,分开奇数和偶数链表,然后再次合并
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode oddEvenList (ListNode head) {
// write code here
if (head == null) {
return head;
}
ListNode evenHead = head.next;
ListNode odd = head, even = evenHead;
while (even != null && even.next != null) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}