1. 程式人生 > >雜談——如何合併兩個有序連結串列(時間複雜度為O(n))

雜談——如何合併兩個有序連結串列(時間複雜度為O(n))

假設本帥博主有連結串列arr1:

int[] arr1 = {1,3,6,8,23,34,56,77,90};

連結串列arr2:

int[] arr2 = {-90,34,55,79,87,98,123,234,567};

我要如何才能夠合併這兩個有序連結串列,使得合併後的連結串列有序,並且使演算法的時間複雜度為O(n)呢?

思考一下噢~

.......

本帥博主也就不說別的啦,直接上程式碼:

Node類:

public class Node 
{
	private Node next;
	private Integer number;
	Node(Integer number)
	{
		this.number=number;
		next=null;
	}
	Node()
	{
		
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	public Integer getNumber() {
		return number;
	}
	public void setNumber(Integer number) {
		this.number = number;
	}
	
}

演算法實現: 

public class SortForLink {
	static int a=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr1 = {1,3,6,8,23,34,56,77,90};
		int[] arr2 = {-90,34,55,79,87,98,123,234,567};
		Node link1 = new Node();
		Node link2 = new Node();
		Node link3 = new Node();
		getLink(arr1,link1);
		getLink(arr2,link2);
		mergeLink(link1, link2, link3);
		viewLink(link3);
	}
	
	/**
	 * 構建連結串列
	 * @param arr
	 * @param link
	 */
	public static void getLink(int[] arr, Node link) {
		for(int i = 0; i < arr.length; i++) {
			link.setNumber(arr[i]);
			link.setNext(new Node());
			link = link.getNext();
		}
	}
	
	/**
	 * 輸出連結串列
	 * @param link
	 */
	public static void viewLink(Node link) {
		while(link.getNumber() != null) {
			System.out.print(link.getNumber()+" ");
			link = link.getNext();
		}
		System.out.println("a的值是:"+a);
	}
	
	/**
	 * 合併連結串列
	 * @param link1
	 * @param link2
	 * @param link3
	 */
	public static void mergeLink(Node link1, Node link2, Node link3) {
		
		if( (link2.getNumber() != null) && (link1.getNumber() == null || link1.getNumber() >= link2.getNumber()) ) {
			link3.setNumber(link2.getNumber());
			link3.setNext(new Node());
			link2 = link2.getNext();
			link3 = link3.getNext();
			a++;
			mergeLink(link1, link2, link3);
		}else if( (link1.getNumber() != null) && (link2.getNumber() == null || link2.getNumber() > link1.getNumber()) ) {
			link3.setNumber(link1.getNumber());
			link3.setNext(new Node());
			link1 = link1.getNext();
			link3 = link3.getNext();
			a++;
			mergeLink(link1, link2, link3);
		}else {
			System.out.println("==沒有了,結束啦!==");
		}		
	}
}

執行結果如下:

 

 

好啦,以上就是關於如何合併兩個有序連結串列為一個有序連結串列並使時間複雜度為O(n)的演算法相關知識總結啦,如果大家有什麼不明白的地方或者發現文中有描述不好的地方,歡迎大家留言評論,我們一起學習呀。

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!