【鏈表】奇偶鏈表

一、題目

力扣原題:https://leetcode-cn.com/problems/odd-even-linked-list/

二、額外開闢空間

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (null == head) {
            return null;
        }

        // 保存奇數節點
        List<ListNode> oddNodes = new ArrayList<>();
        ListNode odd = head;
        while (null != odd) {
            oddNodes.add(odd);
            if (null == odd.next) {
                break;
            }
            odd = odd.next.next;
        }

        // 保存偶數節點
        List<ListNode> evenNodes = new ArrayList<>();
        ListNode even = head.next;
        while (null != even) {
            evenNodes.add(even);
            if (null == even.next) {
                break;
            }
            even = even.next.next;
        }
        
        ListNode root = new ListNode(-1);
        ListNode cur = root;
        for (ListNode oddNode : oddNodes) {
            cur.next = new ListNode(oddNode.val);
            cur = cur.next;
        }
        for (ListNode evenNode : evenNodes) {
            cur.next = new ListNode(evenNode.val);
            cur = cur.next;
        }
        return root.next;
    }
}
  • 時間複雜度:O(n)
  • 空間複雜度:O(n)

三、雙指針

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (null == head) {
            return null;
        }

        // 奇數節點
        ListNode odd = head;
        // 偶數節點
        ListNode even = head.next;
        // 保存頭節點
        ListNode oddRoot = odd;
        ListNode evenRoot = even;
        while (null != even) {
            // 計算並連接下一個奇數節點
            ListNode nextOdd = even.next;
            odd.next = nextOdd;

            // 計算並連接下一個偶數節點
            if (null != even.next) {
                ListNode nextEven = even.next.next;
                even.next = nextEven;
            }

            // 連接鏈表
            if (null != odd.next) {
                odd = odd.next;
            }
            odd.next = evenRoot;
            even = even.next;
        }
        return oddRoot;
    }
}
  • 時間複雜度:O(n)
  • 空間複雜度:O(1)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章