剑指offer之合并已排序链表(递归实现)

1 问题

合并2个已经排好序的链接,比如

1->3->5->7

2->4->6

合并后新的链表如下

1->2->3->4->5->6->7

 
2 代码实现

    #include <stdio.h>
    typedef struct Node
    {
        int val;
        struct Node *next;
    } Node;
     
    /*
     *print list
     */
    void print_list(Node *head)
    {
        if (head == NULL)
        {
            printf("head is NULL\n");
            return;
        }
        Node *p = head;
        while (p != NULL)
        {
            printf("value is %d\n", p->val);
            p = p->next;
        }
    }
     
     
    /*
     *合并链表
     */
    struct Node* merge(Node *head1, Node *head2)
    {
        if (head1 == NULL)
        {
            return head2;
        }
        if (head2 == NULL)
        {
            return head1;
        }
        struct Node *new = NULL;
        if (head1->val < head2->val)
        {
            new = head1;
            new->next = merge(head1->next, head2);
        }
        else
        {
            new = head2;
            new->next = merge(head1, head2->next);
        }
        return new;
    }
     
     
    int main()
    {
        
        //list1 0->3->5->9;
        Node head, node1, node2, node3;
        head.val = 0;
        head.next = &node1;
        node1.val = 3;
        node1.next = &node2;
        node2.val = 5;
        node2.next = &node3;
        node3.val = 9;
        node3.next = NULL;
        printf("list1 is such as\n");
        print_list(&head);
        //list2 1->4->6
        Node head1, node4, node5;
        head1.val = 1;
        head1.next = &node4;
        node4.val = 4;
        node4.next = &node5;
        node5.val = 6;
        node5.next = NULL;
        printf("list2 is such as\n");
        print_list(&head1);
        printf("merge list1 and list2\n");
        Node *new = merge(&head, &head1);
        print_list(new);
        return 0;
    }

 
3 运行结果

    list1 is such as
    value is 0
    value is 3
    value is 5
    value is 9
    list2 is such as
    value is 1
    value is 4
    value is 6
    merge list1 and list2
    value is 0
    value is 1
    value is 3
    value is 4
    value is 5
    value is 6
    value is 9


4 总结

我一开始写成这样了

    struct Node* merge(Node *head1, Node *head2)
    {
        if (head1 == NULL)
        {
            return head2;
        }
        if (head2 == NULL)
        {
            return head1;
        }
        struct Node *new = NULL;
        while (head1 != NULL && head2 != NULL)
        {
            if (head1->val < head2->val)
            {
                new = head1;
                new->next = merge(head1->next, head2);
            }
            else
            {
                new = head2;
                new->next = merge(head1, head2->next);
            }
        }
        return new;
    }

加了while循环 又是递归,肯定容易出问题,一定要记住,递归函数里面循环体里面又有递归一般就有问题
 

 


 


作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)