Leetcode題解中級篇之陣列和字串(8)奇偶連結串列
阿新 • • 發佈:2018-12-27
題目: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第一個節點實現,發現錯了. 這裡第一個奇節點就是頭結點,head
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; } }