Interview Question: Merge two sorted singly linked lists without creating new nodes

后端 未结 26 2683
有刺的猬
有刺的猬 2020-12-02 04:09

This is a programming question asked during a written test for an interview. \"You have two singly linked lists that are already sorted, you have to merge them and return a

相关标签:
26条回答
  • 2020-12-02 04:29
    void printLL(){
        NodeLL cur = head;
        if(cur.getNext() == null){
            System.out.println("LL is emplty");
        }else{
            //System.out.println("printing Node");
            while(cur.getNext() != null){
                cur = cur.getNext();
                System.out.print(cur.getData()+ " ");
    
            }
        }
        System.out.println();
    }
    
    void mergeSortedList(NodeLL node1, NodeLL node2){
        NodeLL cur1 = node1.getNext();
        NodeLL cur2 = node2.getNext();
    
        NodeLL cur = head;
        if(cur1 == null){
            cur = node2;
        }
    
        if(cur2 == null){
            cur = node1;
        }       
        while(cur1 != null && cur2 != null){
    
            if(cur1.getData() <= cur2.getData()){
                cur.setNext(cur1);
                cur1 = cur1.getNext();
            }
            else{
                cur.setNext(cur2);
                cur2 = cur2.getNext();
            }
            cur = cur.getNext();
        }       
        while(cur1 != null){
            cur.setNext(cur1);
            cur1 = cur1.getNext();
            cur = cur.getNext();
        }       
        while(cur2 != null){
            cur.setNext(cur2);
            cur2 = cur2.getNext();
            cur = cur.getNext();
        }       
        printLL();      
    }
    
    0 讨论(0)
  • 2020-12-02 04:31

    Here is a complete working example that uses the linked list implemented java.util. You can just copy paste the code below inside a main() method.

            LinkedList<Integer> dList1 = new LinkedList<Integer>();
            LinkedList<Integer> dList2 = new LinkedList<Integer>();
            LinkedList<Integer> dListMerged = new LinkedList<Integer>();
    
            dList1.addLast(1);
            dList1.addLast(8);
            dList1.addLast(12);
            dList1.addLast(15);
            dList1.addLast(85);
    
            dList2.addLast(2);
            dList2.addLast(3);
            dList2.addLast(12);
            dList2.addLast(24);
            dList2.addLast(85);
            dList2.addLast(185);
    
            int i = 0;
            int y = 0;
            int dList1Size = dList1.size();
            int dList2Size = dList2.size();
            int list1Item = dList1.get(i);
            int list2Item = dList2.get(y);
            while (i < dList1Size || y < dList2Size) {
    
                if (i < dList1Size) {
    
                    if (list1Item <= list2Item || y >= dList2Size) {
                        dListMerged.addLast(list1Item);
                        i++;
                        if (i < dList1Size) {
                            list1Item = dList1.get(i);
                        }
                    }
                }
    
    
                if (y < dList2Size) {
    
                    if (list2Item <= list1Item || i >= dList1Size) {
                        dListMerged.addLast(list2Item);
                        y++;
                        if (y < dList2Size) {
                            list2Item = dList2.get(y);
                        }
                    }
                }
    
            }
    
            for(int x:dListMerged)
            {
                System.out.println(x);
            }
    
    0 讨论(0)
  • 2020-12-02 04:32

    Here is the algorithm on how to merge two sorted linked lists A and B:

    while A not empty or B not empty:
       if first element of A < first element of B:
          remove first element from A
          insert element into C
       end if
       else:
          remove first element from B
          insert element into C
    end while
    

    Here C will be the output list.

    0 讨论(0)
  • 2020-12-02 04:33

    Iteration can be done as below. Complexity = O(n)

    public static LLNode mergeSortedListIteration(LLNode nodeA, LLNode nodeB) {
        LLNode mergedNode ;
        LLNode tempNode ;      
    
        if (nodeA == null) {
            return nodeB;
          } 
          if (nodeB == null) {
            return nodeA;
          }     
    
    
        if ( nodeA.getData() < nodeB.getData())
        {
            mergedNode = nodeA;
            nodeA = nodeA.getNext();
        }
        else
        {
            mergedNode = nodeB;
            nodeB = nodeB.getNext();
        }
    
        tempNode = mergedNode; 
    
        while (nodeA != null && nodeB != null)
        {           
    
            if ( nodeA.getData() < nodeB.getData())
            {               
                mergedNode.setNext(nodeA);
                nodeA = nodeA.getNext();
            }
            else
            {
                mergedNode.setNext(nodeB);
                nodeB = nodeB.getNext();                
            }       
            mergedNode = mergedNode.getNext();
        }
    
        if (nodeA != null)
        {
            mergedNode.setNext(nodeA);
        }
    
        if (nodeB != null)
        {
            mergedNode.setNext(nodeB);
        }       
        return tempNode;
    }
    
    0 讨论(0)
  • 2020-12-02 04:33
            /* Simple/Elegant Iterative approach in Java*/    
            private static LinkedList mergeLists(LinkedList list1, LinkedList list2) {
                        Node head1 = list1.start;
                        Node head2 = list2.start;
                        if (list1.size == 0)
                        return list2;
                        if (list2.size == 0)
                        return list1;               
                        LinkedList mergeList = new LinkedList();
                        while (head1 != null && head2 != null) {
                            if (head1.getData() < head2.getData()) {
                                int data = head1.getData();
                                mergeList.insert(data);
                                head1 = head1.getNext();
                            } else {
                                int data = head2.getData();
                                mergeList.insert(data);
                                head2 = head2.getNext();
                            }
                        }
                        while (head1 != null) {
                            int data = head1.getData();
                            mergeList.insert(data);
                            head1 = head1.getNext();
                        }
                        while (head2 != null) {
                            int data = head2.getData();
                            mergeList.insert(data);
                            head2 = head2.getNext();
                        }
                        return mergeList;
                    }
    
    /* Build-In singly LinkedList class in Java*/
    class LinkedList {
        Node start;
        int size = 0;
    
        void insert(int data) {
            if (start == null)
                start = new Node(data);
            else {
                Node temp = start;
                while (temp.getNext() != null) {
                    temp = temp.getNext();
                }
                temp.setNext(new Node(data));
            }
            size++;
        }
    
        @Override
        public String toString() {
    
            String str = "";
            Node temp=start;
            while (temp != null) {
                str += temp.getData() + "-->";
                temp = temp.getNext();
            }
            return str;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-02 04:33
    // Common code for insert at the end
            private void insertEnd(int data) {
                    Node newNode = new Node(data);
                    if (head == null) {
                        newNode.next = head;
                        head = tail = newNode;
                        return;
                    }
                    Node tempNode = tail;
                    tempNode.next = newNode;
                    tail = newNode;
                }
    
        private void mergerTwoSortedListInAscOrder(Node tempNode1, Node tempNode2) {
    
                if (tempNode1 == null && tempNode2 == null)
                    return;
                if (tempNode1 == null) {
                    head3 = tempNode2;
                    return;
                }
                if (tempNode2 == null) {
                    head3 = tempNode1;
                    return;
                }
    
                while (tempNode1 != null && tempNode2 != null) {
    
                    if (tempNode1.mData < tempNode2.mData) {
                        insertEndForHead3(tempNode1.mData);
                        tempNode1 = tempNode1.next;
                    } else if (tempNode1.mData > tempNode2.mData) {
                        insertEndForHead3(tempNode2.mData);
                        tempNode2 = tempNode2.next;
                    } else {
                        insertEndForHead3(tempNode1.mData);
                        insertEndForHead3(tempNode2.mData);
                        tempNode1 = tempNode1.next;
                        tempNode2 = tempNode2.next;
                    }
    
                }
                if (tempNode1 != null) {
                    while (tempNode1 != null) {
                        insertEndForHead3(tempNode1.mData);
                        tempNode1 = tempNode1.next;
                    }
                }
                if (tempNode2 != null) {
                    while (tempNode2 != null) {
                        insertEndForHead3(tempNode2.mData);
                        tempNode2 = tempNode2.next;
                    }
                }
            }
    

    :)GlbMP

    0 讨论(0)
提交回复
热议问题