1. 程式人生 > >牛客網線上程式設計專題《劍指offer-面試題17》合併兩個排序的連結串列

牛客網線上程式設計專題《劍指offer-面試題17》合併兩個排序的連結串列

題目連結:

題目描述:

解題思路:

(1)方法一:

修改兩個待合併連結串列的引用域,使它們稱為一個有序的連結串列list3。具體思路如下圖所示:

已經AC的程式碼:

public class MergeLinkedList {
	
	// 定義結點
	public class ListNode {
	    int val;
	    ListNode next = null;

	    ListNode(int val) {
	        this.val = val;
	    }
	}
	
	// 建立連結串列
	public ListNode currentNode = null;
    ListNode head_cre = null;
	public ListNode createList(int val) {
		if(head_cre == null) {
			head_cre = new ListNode(val);
			currentNode = head_cre;
		}else {
			ListNode temp = new ListNode(val);
			currentNode.next = temp;
			currentNode = temp;
		}
		return head_cre;
	}
	
	// 合併兩個有序連結串列
    public ListNode Merge(ListNode list1,ListNode list2) {
    	ListNode pa = list1;
    	ListNode pb = list2;
    	ListNode pc = null;
    	ListNode list3 = null;
    	if(list1 == null)
    		return list2;
    	if(list2 == null)
    		return list1;
    	while(pa != null && pb != null) {
    		if(pa.val <= pb.val) {
    			if(pc == null) {
    				pc = pa;
    				list3 = pc;
    			}
    			else {
    				pc.next = pa;
    				pc = pa;
    			}
    			pa = pa.next;
    		}else {
    			if (pc == null) {
    				pc = pb;
    				list3 = pc;
    			}
    			else {
    				pc.next = pb;
    				pc = pb;
    			}
				pb = pb.next;
			}
    	}
    	if(pa == null) {
    		pc.next = pb;
    	}else {
    		pc.next = pa;
    	}
    	return list3;
    }
    
	//方法:遍歷連結串列(列印輸出連結串列。方法的引數表示從節點node開始進行遍歷
    ListNode current = null;
    public void print(ListNode node) {
        if (node == null) {
            return;
        }

        current = node;
        while (current != null) {
            System.out.println(current.val);
            current = current.next;
        }
    }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MergeLinkedList mg = new MergeLinkedList();
		ListNode list1 = null;
		ListNode list2 = null;
		ListNode list3 = null;
		// 測試用例
		for(int i=1; i<=5; i+=2) {
			list1 = mg.createList(i);
		}
		mg.head_cre = null;
		mg.currentNode = null;
		for(int i=2; i<=6; i+=2) {
			list2 = mg.createList(i);
		}
		// 合併兩個有序連結串列
		list3 = mg.Merge(list1, list2);
		//打印出合併後的新連結串列
		mg.print(list3);
	}

}

 (2)方法二:遞迴法

    public ListNode Merge(ListNode list1,ListNode list2) {
		ListNode pc = null;
		if(list1 == null) {
			return list2;
		}else if(list2 == null) {
			return list1;
		}
		if(list1.val <= list2.val) {
			pc = list1;
			pc.next = Merge(list1.next, list2);
		}else {
			pc = list2;
			pc.next = Merge(list1, list2.next);
		}
		return pc;
    }