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

后端 未结 26 2680
有刺的猬
有刺的猬 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:13
    Node mergeList(Node h1, Node h2) {
        if (h1 == null) return h2;
        if (h2 == null) return h1;
        Node head;
        if (h1.data < h2.data) {
            head = h1;
        } else {
            head = h2;
            h2 = h1;
            h1 = head;
        }
    
        while (h1.next != null && h2 != null) {
            if (h1.next.data < h2.data) {
                h1 = h1.next;
            } else {
                Node afterh2 = h2.next;
                Node afterh1 = h1.next;
                h1.next = h2;
                h2.next = afterh1;
    
                if (h2.next != null) {
                    h2 = afterh2;
                }
            }
        }
        return head;
    }
    
    0 讨论(0)
  • 2020-12-02 04:13

    This could be done without creating the extra node, with just an another Node reference passing to the parameters (Node temp).

    private static Node mergeTwoLists(Node nodeList1, Node nodeList2, Node temp) {
        if(nodeList1 == null) return nodeList2;
        if(nodeList2 == null) return nodeList1;
    
        if(nodeList1.data <= nodeList2.data){
            temp = nodeList1;
            temp.next = mergeTwoLists(nodeList1.next, nodeList2, temp);
        }
        else{
            temp = nodeList2;
            temp.next = mergeTwoLists(nodeList1, nodeList2.next, temp);
        }
        return temp;
    }
    
    0 讨论(0)
  • 2020-12-02 04:15
    Node * merge_sort(Node *a, Node *b){
       Node *result = NULL;
       if(a ==  NULL)
          return b;
       else if(b == NULL)
          return a;
    
      /* For the first node, we would set the result to either a or b */
        if(a->data <= b->data){
           result = a;
        /* Result's next will point to smaller one in lists 
           starting at a->next  and b */
          result->next = merge_sort(a->next,b);
        }
        else {
          result = b;
         /*Result's next will point to smaller one in lists 
           starting at a and b->next */
           result->next = merge_sort(a,b->next);
        }
        return result;
     }
    

    Please refer to my blog post for http://www.algorithmsandme.com/2013/10/linked-list-merge-two-sorted-linked.html

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

    I created only one dummy node at the beginning to save myself many 'if' conditions.

        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
            ListNode list1Cursor = l1;
            ListNode list2Cursor = l2;
    
            ListNode currentNode = new ListNode(-1); // Dummy node
            ListNode head = currentNode;
    
            while (list1Cursor != null && list2Cursor != null)
            {
                if (list1Cursor.val < list2Cursor.val) {
                    currentNode.next = list1Cursor;
                    list1Cursor = list1Cursor.next;
                    currentNode = currentNode.next;
                } else {
                    currentNode.next = list2Cursor;
                    list2Cursor = list2Cursor.next;
                    currentNode = currentNode.next;
                }
            }
    
            // Complete the rest
            while (list1Cursor != null) {
                currentNode.next = list1Cursor;
                currentNode = currentNode.next;
                list1Cursor = list1Cursor.next;
            }
            while (list2Cursor != null) {
                currentNode.next = list2Cursor;
                currentNode = currentNode.next;
                list2Cursor = list2Cursor.next;
            }
    
            return head.next;
        }
    
    
    0 讨论(0)
  • 2020-12-02 04:16
    Node MergeLists(Node list1, Node list2) {
      if (list1 == null) return list2;
      if (list2 == null) return list1;
    
      if (list1.data < list2.data) {
        list1.next = MergeLists(list1.next, list2);
        return list1;
      } else {
        list2.next = MergeLists(list2.next, list1);
        return list2;
      }
    }
    
    0 讨论(0)
  • 2020-12-02 04:21

    Recursive way(variant of Stefan answer)

     MergeList(Node nodeA, Node nodeB ){
            if(nodeA==null){return nodeB};
            if(nodeB==null){return nodeA};
    
        if(nodeB.data<nodeA.data){
            Node returnNode = MergeNode(nodeA,nodeB.next);
            nodeB.next = returnNode;
            retturn nodeB;
        }else{
            Node returnNode = MergeNode(nodeA.next,nodeB);
            nodeA.next=returnNode;
            return nodeA;
        }
    

    Consider below linked list to visualize this

    2>4 list A 1>3 list B

    Almost same answer(non recursive) as Stefan but with little more comments/meaningful variable name. Also covered double linked list in comments if someone is interested

    Consider the example

    5->10->15>21 // List1

    2->3->6->20 //List2

    Node MergeLists(List list1, List list2) {
      if (list1 == null) return list2;
      if (list2 == null) return list1;
    
    if(list1.head.data>list2.head.data){
      listB =list2; // loop over this list as its head is smaller
      listA =list1;
    } else {
      listA =list2; // loop over this list
      listB =list1;
    }
    
    
    listB.currentNode=listB.head;
    listA.currentNode=listA.head;
    
    while(listB.currentNode!=null){
    
      if(listB.currentNode.data<listA.currentNode.data){
        Node insertFromNode = listB.currentNode.prev; 
        Node startingNode = listA.currentNode;
        Node temp = inserFromNode.next;
        inserFromNode.next = startingNode;
        startingNode.next=temp;
    
        startingNode.next.prev= startingNode; // for doubly linked list
        startingNode.prev=inserFromNode;  // for doubly linked list
    
    
        listB.currentNode= listB.currentNode.next;
        listA.currentNode= listA.currentNode.next;
    
      } 
      else
      {
        listB.currentNode= listB.currentNode.next;
    
      }
    
    }
    
    0 讨论(0)
提交回复
热议问题