《劍指 offer》 學習16之合併兩個排序的鏈表

題目描述

輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
題目鏈接:牛客網

解題思路

方法一:遞歸

public class Main {
    public static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
}
    
	public static void main(String[] args) {
	    ListNode root = new ListNode(1);
        root.next = new ListNode(2);
        root.next.next = new ListNode(3);
        root.next.next.next = new ListNode(4);
        root.next.next.next.next = new ListNode(5);
        
        ListNode root2 = new ListNode(1);
        root2.next = new ListNode(3);
        root2.next.next = new ListNode(5);
        root2.next.next.next = new ListNode(6);
        root2.next.next.next.next = new ListNode(7);
	    
	    ListNode head = merge(root,root2); 
	    printNode(head);
	    
	}
	
	public static ListNode merge(ListNode list1,ListNode list2) {
	    if (list1 == null) {
	       return list2;
	    } 
	   
	    if (list2 == null) {
	       return list1;
	    }
	    
	    if (list1.val <= list2.val) {
	        list1.next = merge(list1.next,list2);
	        return list1;
	    } else {
	        list2.next = merge(list1,list2.next);
	        return list2;
	    }
	    
	}
	
	/**
     * 輸出鏈表的元素值
     *
     */
    public static void printNode(ListNode head) {
        while (head != null) {
            System.out.print(head.val + "->");
            head = head.next;
        }
        System.out.println("null");
    }
}

方法二:迭代

public class Main {
    public static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
}
    
	public static void main(String[] args) {
	    ListNode root = new ListNode(1);
        root.next = new ListNode(2);
        root.next.next = new ListNode(3);
        root.next.next.next = new ListNode(4);
        root.next.next.next.next = new ListNode(5);
        
        ListNode root2 = new ListNode(1);
        root2.next = new ListNode(3);
        root2.next.next = new ListNode(5);
        root2.next.next.next = new ListNode(6);
        root2.next.next.next.next = new ListNode(7);
	    
	    ListNode head = merge(root,root2); 
	    printNode(head);
	    
	}
	
	public static ListNode merge(ListNode list1,ListNode list2) {
	    ListNode head = new ListNode(-1);
	    ListNode cur = head;
	    
	    while(list1 != null && list2 != null) {
	        if (list1.val <= list2.val) {
	            cur.next = list1;
	            list1 = list1.next;
	        } else {
	            cur.next = list2;
	            list2 = list2.next;
	        }
	        cur = cur.next;
	    }
	    
	    if (list1 != null) {
	        cur.next = list1;
	    } 
	    
	    if (list2 != null) {
	        cur.next = list2;
	    }
	    
	    return head.next;
	    
	}
	
	/**
     * 輸出鏈表的元素值
     *
     */
    public static void printNode(ListNode head) {
        while (head != null) {
            System.out.print(head.val + "->");
            head = head.next;
        }
        System.out.println("null");
    }
}

測試結果

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章