劍指offer-合並兩個排序的鏈表


題目描述

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

public class Test {
    
    class ListNode {
        int value;
        ListNode next;
        public ListNode(int value) {
            this.value = value;
        }
    }
    /**
     * node1: 1->3->5->7;
     * node2: 2->4->6->8->9->10->11;
     * @param args
     */
    public static void main(String[] args) {
        Test t = new Test();
        ListNode node1 = t.new ListNode(1);
        ListNode node2 = t.new ListNode(2);
        ListNode node3 = t.new ListNode(3);
        ListNode node4 = t.new ListNode(4);
        ListNode node5 = t.new ListNode(5);
        ListNode node6 = t.new ListNode(6);
        ListNode node7 = t.new ListNode(7);
        ListNode node8 = t.new ListNode(8);
        ListNode node9 = t.new ListNode(9);
        ListNode node10 = t.new ListNode(10);
        ListNode node11= t.new ListNode(11);
        node1.next = node3;
        node2.next = node4;
        node3.next = node5;
        node4.next = node6;
        node5.next = node7;
        node6.next = node8;
        node7.next = null;
        node8.next = node9;
        node9.next = node10;
        node10.next = node11;
        node11.next = null;
    
        
        ListNode mergeNode = t.merge1(node1,node2);
        while(mergeNode != null) {
            System.out.println(mergeNode.value);  // 打印合並鏈表
            mergeNode = mergeNode.next;
        }
    }    
    /**
     * 遞歸方法:調用自身進行比較合並,消耗內存。
     * @param head1
     * @param head2
     * @return
     */
    public ListNode merge(ListNode head1, ListNode head2) {
        // head1為空,返回head2
        if(head1 == null) return head2;
        // head2為空,返回head1
        if(head2 == null) return head1;
        // 記錄合並鏈表
        ListNode node = null;
        if(head1.value > head2.value) {
            node = head2;
            node.next = merge(head1, head2.next);
        } else {
            node = head1;
            node.next = merge(head1.next, head2);
        }
        return node;
    }
    
    /**
     * 非遞歸方法:消耗內存少。
     * @param head1
     * @param head2
     * @return
     */
    public ListNode merge1(ListNode head1, ListNode head2) {
        // head1為空,返回head2
        if(head1 == null) return head2;
        // head2為空,返回head1
        if(head2 == null) return head1;
        // 記錄合並鏈表
        ListNode tempNode = new ListNode(-1);   
        // 指向合並鏈表的尾結點
        ListNode node = tempNode;
        
        // 兩鏈表都不為空進行比較合並 
        while(head1 !=null && head2 !=null) {
            if(head1.value < head2.value) {   
                node.next = head1;
                head1 = head1.next;
            } else {
                node.next = head2;
                head2 = head2.next;
            }
            node = node.next; // 將指針移動到合並后鏈表的結尾,方便下次
        }
        // 如果第一個鏈表的元素未處理完,將其接到合並鏈表的最后一個結點之后
        if(head1 != null) {
            node.next = head1;
        }
        
        // 如果第二個鏈表的元素未處理完,將其接到合並鏈表的最后一個結點之后
        if(head2 != null) {
            node.next = head2;
        }
        return tempNode.next;  
    }
}

 


免責聲明!

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



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