zoukankan      html  css  js  c++  java
  • LeetCode Notes_#328_奇偶链表

    LeetCode Notes_#328_奇偶链表

    Contents

    题目

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
    请尝试使用原地算法完成。你的算法的空间复杂度应为 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

    说明:
    应当保持奇数节点和偶数节点的相对顺序。
    链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

    解答

    方法1:计数器+借用额外空间

    借助额外空间,分别建立偶链表和奇链表,最后连在一起,空间复杂度高。

    class Solution {
        public ListNode oddEvenList(ListNode head) {
            int count = 1;
            ListNode dummyEven = new ListNode(0);
            ListNode curEven = dummyEven;
            ListNode dummyOdd = new ListNode(0);
            ListNode curOdd = dummyOdd;
            while(head != null){
                if(count % 2 == 1){
                    curOdd.next = new ListNode(head.val);
                    curOdd = curOdd.next;
                }
                else{
                    curEven.next = new ListNode(head.val);
                    curEven = curEven.next;
                }
                head = head.next;
                count++;
            }
            curOdd.next = dummyEven.next;
            return dummyOdd.next; 
        }
    }

    复杂度分析

    时间复杂度:O(n)
    空间复杂度:O(n)

    方法2:原地修改链表

    其实不需要计数器,也不需要额外空间。因为奇偶节点本来就是交替出现的,所以可以交替地连接奇偶链表,最后再合并。

    class Solution {
        public ListNode oddEvenList(ListNode head) {
            if(head == null || head.next == null) return head;
            ListNode headEven = head.next;
            ListNode curEven = headEven;
            ListNode curOdd = head;
            //遇到最后一个节点,就终止循环
            while(curOdd.next != null && curEven.next != null){   
                curOdd.next = curEven.next;
                curOdd = curOdd.next;
                curEven.next = curOdd.next;
                curEven = curEven.next;
            }
            curOdd.next = headEven;
            return head; 
        }
    }

    复杂度分析

    时间复杂度:O(n)
    空间复杂度:O(1)

  • 相关阅读:
    HDOJ 2577 How To Type
    HDOJ 1171 Big Event in HDU
    HDOJ 2159 FATE
    HDOJ 1176 免费馅饼
    POJ 1014 Dividing
    HDOJ 2844 Coins
    可以设置DefaultButton的TextBox控件
    setTimeout和setInterval的使用
    C# 调用ExchangeWebservice的相关代码
    实现IConfigurationSectionHandler接口来编写自定义配置
  • 原文地址:https://www.cnblogs.com/Howfars/p/13536436.html
Copyright © 2011-2022 走看看