數據結構算法學習系列---- 兩個有序的鏈表合併

a

 3、題目

      兩個有序鏈表序列的合併,要求:不增加新的空間,只進行指針的操作  

     例如:有兩個單鏈表  list1: 1 -> 3 -> 5 -> 8 -> 9  ,list2 :  2-> 4 -> 6 -> 7 -> 10 ,合併

    

class LinkedNode<T> {
    public T  value;
    public LinkedNode<T>  next;
    public LinkedNode<T>  pre;


    LinkedNode(T value){
        this.value = value;
    }

}

public class LinkedList {

    public void print(LinkedNode<Integer> root){
        LinkedNode<Integer>  tmp = root;
        while (tmp!=null){
            System.out.print(tmp.value+" ");
            tmp = tmp.next;
        }
        System.out.println();
    }

    public LinkedNode<Integer> constructLinkedList(LinkedNode<Integer>... nodes){
        LinkedNode<Integer>  root = new LinkedNode<>(0);
        LinkedNode<Integer>  tmp  = root;
        for(LinkedNode<Integer> node:nodes){
            tmp.next = node;
            tmp = tmp.next;
        }
        return root.next;
    }

    @Test
    public void test1(){
        LinkedNode<Integer>  node11 = new LinkedNode<>(1);
        LinkedNode<Integer>  node12 = new LinkedNode<>(3);
        LinkedNode<Integer>  node13 = new LinkedNode<>(5);
        LinkedNode<Integer>  node14 = new LinkedNode<>(8);
        LinkedNode<Integer>  node15 = new LinkedNode<>(9);

        LinkedNode<Integer>  node21 = new LinkedNode<>(2);
        LinkedNode<Integer>  node22 = new LinkedNode<>(4);
        LinkedNode<Integer>  node23 = new LinkedNode<>(6);
        LinkedNode<Integer>  node24 = new LinkedNode<>(7);
        LinkedNode<Integer>  node25 = new LinkedNode<>(10);

        LinkedNode<Integer>  root1 = constructLinkedList(node11,node12,node13,node14,node15);
        LinkedNode<Integer>  root2 = constructLinkedList(node21,node22,node23,node24,node25);
        System.out.println("before merge");
        print(root1);
        print(root2);
        System.out.println("-------");
        LinkedNode<Integer>  root = null;
        LinkedNode<Integer>  tmp1 = null;
        LinkedNode<Integer>  tmp2 = null;
        LinkedNode<Integer>  tmp = null;
        if(root1.value<root2.value){
            root = root1;
            tmp1 = root1.next;
            root.next = null;
            tmp2 = root2;
        }else {
            root = root2;
            tmp2 = root2.next;
            root.next = null;
            tmp1 = root1;
        }
        tmp = root;
        while (tmp1 !=null && tmp2 !=null){
            if(tmp1.value<tmp2.value){
                tmp.next = tmp1;
                tmp = tmp.next;
                tmp1 = tmp1.next;
                tmp.next=null;
            }else {
                tmp.next = tmp2;
                tmp = tmp.next;
                tmp2 = tmp2.next;
                tmp.next=null;
            }
        }
        while (tmp1!=null){
            tmp.next = tmp1;
            tmp1 = tmp1.next;
            tmp = tmp.next;
        }

        while (tmp2!=null){
            tmp.next = tmp2;
            tmp2 = tmp2.next;
            tmp = tmp.next;
        }
        tmp.next = null;

        print(root);

    }

}

 運行結果如下: 

before merge
1 3 5 8 9 
2 4 6 7 10 
-------
1 2 3 4 5 6 7 8 9 10 

 

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