1. 程式人生 > >關於合併有序陣列/連結串列的總結

關於合併有序陣列/連結串列的總結

 通過最近的研究,發現好多公司在筆試和麵試中還是挺喜歡讓你寫一些合併類的程式。主要有合併兩個有序陣列和合並兩個有序單鏈表(可擴充套件考慮如何合併K個有序連結串列),本部落格中,對合並有序陣列和合並有序連結串列做了一個總結,以便自己接下來的翻閱,也為了給小夥伴分享。

1、合併兩個有序的陣列

演算法步驟如下:

  • 建立一個可以容納兩個有序陣列的新陣列
  • 通過對陣列1和陣列2中每位進行比較,存入新陣列中
  • 當某一個數組較短,比較結束後,將較長陣列中剩餘的元素都加入新陣列中

程式碼如下:

package cn.ywq.test;

public class Client {

	public static void main(String[] args) {

		int[] a = { 1, 3, 5, 7, 12, 14, 23, 45, 46, 67, 89, 100 };
		int[] b = { 2, 4, 6, 8, 9, 68 };
		int[] result = Merge(a, b);
		for (int i : result) {
			System.out.println(i);
		}

	}

	private static int[] Merge(int a[], int b[]) {

		int result[] = new int[a.length + b.length];
		int i = 0, j = 0, k = 0; // i:用於標示a陣列 j:用來標示b陣列 k:用來標示傳入的陣列

		while (i < a.length && j < b.length) {
			if (a[i] <= b[j]) {
				result[k++] = a[i++]; // 這種用法  很厲害
			} else {
				result[k++] = b[j++]; // 這種用法  很厲害
			}
		}

		// 下邊的兩個迴圈是將長的陣列剩下的部分存入result陣列中
		while (i < a.length)
			result[k++] = a[i++];
		while (j < b.length)
			result[k++] = b[j++];

		return result;
	}
}

2、合併兩個有序的單鏈表

步驟如下:

  • 建立連結串列的結構
  • 建立兩個有序的單鏈表
  • 呼叫合併方法進行合併操作

在合併方法中,通過對連結串列data域的比較指標的移動,使用遞迴的方法來完成合並操作。

程式碼如下:

package com.ywq.test2;

import org.junit.Test;

public class Solution2 {

	@Test
	public void test() {
		//建立有序連結串列list1  0-2-5-7-9
		ListNode list1 = new ListNode(0);  
		list1.next = new ListNode(2);  
		list1.next.next = new ListNode(5);  
		list1.next.next.next = new ListNode(7); 
		list1.next.next.next.next = new ListNode(9);
	 
		//建立有序連結串列list2  1-3-6-8
        ListNode list2 = new ListNode(1);  
        list2.next = new ListNode(3);  
        list2.next.next = new ListNode(6);  
        list2.next.next.next = new ListNode(8); 
  
        //呼叫合併方法
        ListNode list3 = mergeKLists(list1, list2); 
        //將結果輸出
        while (list3 != null) {  
            System.out.println(list3.val);  
            list3 = list3.next;  
        }  
	}

	public ListNode mergeKLists(ListNode list1, ListNode list2) {
		
		ListNode result=null;
		
		if (list1 == null && list2 == null) {  
            return null;  
        }  
        if (list1 == null) {  
            result = list2;  
            return result;  
        }  
        if (list2 == null) {  
            result = list1;  
            return result;  
        }  
        if (list1.val > list2.val) {  
            result = list2;  
            list2 = list2.next;  
        } else {  
            result = list1;  
            list1 = list1.next;  
        }  
        result.next = mergeKLists(list1, list2);  
        
        return result;  
		
	     
	
	}
	
}


class ListNode {
    public int val;
    public ListNode next;

    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

 如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~