合並兩個排序的鏈表


題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。

方法一(遞歸)
合並過程中,首先比較兩個鏈表的首節點哪個小,較小的節點作為合成鏈表的首節點,之后將指針指向較小節點的后一個節點,再次進行上面邏輯的比較,可以發現比較過程是一個遞歸的操作。

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

    	return listAll;
    	
    }

通過遞歸到最大的節點,並進行返回遞歸操作到上一次遞歸的空間,將返回節點作為當前次大節點的下一個節點,這樣從后到前返回到第一個節點的空間,遞歸操作完成。

方法二(非遞歸)

    public ListNode Merge_2(ListNode list1,ListNode list2) {
    	if(list2 == null) {
    		return list1;
    	}
    	else if(list1 == null) {
    		return list2;
    	}
    	
    	ListNode mergeHead = new ListNode(0);
    	ListNode current = mergeHead;
    	
    	while(list1 != null && list2 != null) {
    		if(list1.val < list2.val) {
    			current.next = list1;
    			list1 = list1.next;
    		}
    		else {
    			current.next = list2;
    			list2 = list2.next;
    		}
    		
    		current = current.next;
    	}
    	
    	if(list1 == null) {
    		current.next = 	list2;
    	}
    	
    	if(list2 == null) {
    		current.next = list1;
    	}
    	
    	return mergeHead.next;

    }

注意聲明mergeHead來作為合成鏈表的頭結點,聲明current來作為一個當前合成鏈表最后一個節點的指針,初始化指向頭結點,之后比較兩個鏈表對應元素大小,並修改兩個兩個鏈表和current的指針指向。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM