leetcode-328-奇偶連結串列(odd even linkedlist)-java
阿新 • • 發佈:2018-11-12
題目及測試
package pid328; /* 奇偶連結串列 給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。 請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 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 說明: 應當保持奇數節點和偶數節點的相對順序。 連結串列的第一個節點視為奇數節點,第二個節點視為偶數節點,以此類推。 */ public class main { public static void main(String[] args) { LinkList a=new LinkList(1); a.addLast(2); a.addLast(3); a.addLast(4); a.addLast(5); a.printList(); test(a.first); LinkList b=new LinkList(5); b.addLast(6); b.addLast(4); b.addLast(2); b.addLast(1); b.addLast(3); b.printList(); test(b.first); /* LinkList c=new LinkList(1); c.addLast(2); c.addLast(2); c.addLast(1); c.printList(); //test(c.first); LinkList d=new LinkList(1); d.addLast(2); d.addLast(3); c.printList(); d.printList(); test(c.first,d.first);*/ } private static void test(ListNode ito) { Solution solution = new Solution(); ListNode rtn; long begin = System.currentTimeMillis(); System.out.println(); //開始時列印陣列 rtn=solution.oddEvenList(ito);//執行程式 long end = System.currentTimeMillis(); System.out.println("rtn="); rtn.printNodeToEnd(); //System.out.println(":rtn" ); //System.out.print(rtn); System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,4ms,超快)
雙指標,設定奇數的頭尾,偶數的頭尾,在一次遍歷中,如果該為奇數位,則奇數的尾.next=now,偶數亦然,最後奇數尾.next=偶數頭,偶數尾.next=null
package pid328; import java.math.BigInteger; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; /** * 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(head==null||head.next==null){ return head; } ListNode evenHead=head.next; ListNode oddTail=head; ListNode evenTail=evenHead; ListNode now=evenHead.next; boolean isOdd=true; while(now!=null){ if(isOdd){ oddTail.next=now; oddTail=oddTail.next; isOdd=false; } else{ evenTail.next=now; evenTail=evenTail.next; isOdd=true; } now=now.next; } oddTail.next=evenHead; evenTail.next=null; return head; } }