Leetcode題解中級篇之數組和字符串(8)遞增的三元子序列

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/31/linked-list/83/

題目描述:

奇偶鏈表

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裏的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地算法完成。你的算法的空間複雜度應爲 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 2 3 4 5 6 7 8    我想的是,只需要1 -》3 -》5-》7  然後 7指向2-》4-》6-》8 就可以. 實現起來還是很難,看了別人的才寫出來. 一開始想,分別 循環 odd= odd.next.next;  even = even.next.next ,再將odd 最後節點連上even第一個節點實現,發現錯了.

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null ||head.next == null ||head.next.next == null) return head;
    
        ListNode odd_h = head, odd_t = head; //創建一個節點指向第一個奇節點
        ListNode even_h = head.next, even_t = head.next;//創建一個節點指向第一個偶節點
        //ListNode pointer = head.next.next;
        
        
        while( even_t!=null && even_t.next!= null){ 
            
            //odd & even are in one loop unit
            odd_t.next = even_t.next;//指向偶節點後面一個奇節點
            odd_t = odd_t.next; //odd_t 指向該節點
            
            even_t.next = odd_t.next;//此時,由於奇節點已經移動,下一個偶節點便是第二個偶節點
            even_t = even_t.next;//even_ 指向該節點.
            
        }
        
       
        odd_t.next = even_h;
        
        return odd_h;
    }
}

 

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