链表面试题-合并两个有序单链表(递归和非递归)

题目描述:
合并两个有序单链表,使得最终的链表也是递增的。

这里写图片描述

节点的结构

typedef struct ListNode
{
    ListNode* _next;
    int _data;
}Node;

递归:

Node* MergeListR(Node* Head1,Node* Head2)
{
    if(NULL == Head1 || NULL == Head2){
        if(NULL == Head1)
            return Head2;

        return Head1;
    }

    Node* newHead = NULL;
    //较小的作为新链表的头
    if(Head1->_data < Head2->_data){
        newHead = Head1;
        newHead->_next = MergeList(newHead->_next,Head2);
    }else{
        newHead = Head2;
        newHead->_next = MergeList(Head1,newHead->_next);
    }

    return newHead;
}

非递归实现:

思路:

  1. 先选取较小的作为新链表的头
  2. 依次比较两个链表的大小,选出小的链到新链表的后面
  3. 当一个链表走完,另一个没走完时,直接链到新链表的后面

代码:

Node* MergeTwoListR(Node* Head1,Node* Head2)
{
    if(Head1 == NULL)
        return Head2;
    if(Head2 == NULL)
        return Head1;

    Node* node1 = Head1;
    Node* node2 = Head2;
    //合并后新链表的头
    Node* newHead = NULL;

    //较小的作为头节点
    if(node1->_data <= node2->_data){
        newHead = node1;
        node1 = node1->_next;
    }else{
        newHead = node2;
        node2 = node2->_next;
    }

    //让newHead一直指向新链表的头作为返回值
    Node* cur = newHead;
    while(node1 != NULL && node2 != NULL){
        if(node1->_data <= node2->_data){
            cur->_next = node1;
            node1 = node1->_next;
            cur = cur->_next;
        }else{
            cur->_next = node2;
            node2 = node2->_next;
            cur = cur->_next;
        }
    }

    //如果node1没结束
    if(node1 != NULL){
        cur->_next = node1;
    }

    //如果node2没结束
    if(node2 != NULL){
        cur->_next = node2;
    }

    return newHead;
}

文中的代码为手打,并非复制粘贴,所以如有错误,还请指正,第一时间回复。

猜你喜欢

转载自blog.csdn.net/qq_36528114/article/details/79516032