LeetCode第328题:奇偶链表

题干

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
复制代码

示例 2:

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL
复制代码

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/od…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:合成链表

这道题的解法和86题分隔链表时非常像的,我们依然使用两个左右链表进行筛选再进行连接就可以高效的完成这道题目。

代码实现:

/**
 * 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) {
    let left = new ListNode(-1);
    let Right = new ListNode(-1);
    let leftCurrent = left;
    let rightCurrent = Right;
    let currentIndex = 1;
    while (head != null) {
        if (currentIndex % 2 != 0) {
            let node1 = new ListNode(head.val);
            leftCurrent.next = node1;
            leftCurrent = leftCurrent.next;
        } else {
            let node2 = new ListNode(head.val);
            rightCurrent.next = node2;
            rightCurrent = rightCurrent.next;
        }
        head=head.next;
        currentIndex++;
    }
    // 拼接两奇偶链表
    leftCurrent.next=Right.next;
    return left.next
};
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享