一、题目讲述
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
二、思路讲解
按照题意,我们只有O(1)的空间记录变量,和循环一遍链表的时间。
很简单只要把,一个变量存奇数链表,一个变量存偶数链表,还有一个存储偶数链表头。
循环思路:
head为单数,head.next为偶数,接着head.next.next为单数。以此为逻辑进行循环记录就可以了
吐槽一句,我把空间复杂度O(1)想复杂了。。。
三、核心代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var oddEvenList = function(head) {
if(head == null){
return head;
}
var dan = head; //奇数链表
var even = head.next; //偶数链表
var headt = even; //偶数链表头
while(even != null && even.next != null){ //如果为空跳过
dan.next = even.next;
dan = dan.next;
even.next = dan.next;
even = even.next;
}
dan.next =headt; // 合并单双链表
return head;
};