1. 程式人生 > >leetcode-328-奇偶連結串列(odd even linkedlist)-java

leetcode-328-奇偶連結串列(odd even linkedlist)-java

題目及測試

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;
    }
}