思路一:非递归
两个链表是排序过的,所以我们只需要同时遍历两个链表,比较链表元素的大小,将小的连接到新的链
表中即可。最后,可能有一个链表会先遍历完,此时,我们直接将另一个链表连接到新链表的最后即可。

struct listnode* merge_list(struct listnode* H1,struct listnode* H2)
{
    struct listnode* H;
    if(H1==NULL)
        return H2;
    if(H2==NULL)
        return H1;
    if((H=(struct listnode*)malloc(sizeof(struct listnode)))==NULL)
    {  
      printf("malloc filed\n");
      return NULL;
    }
    struct listnode* pre=H;
    while(H1 && H2)
    {
        if(H1->data <= H2->data)
        {
            pre->next=H1->data;
            H1=H1->next;
        }else{
             pre->next=H2->data;
             H2=H2->next;
        }
        pre=pre->next;
    }
    pre->next=(NULL == H1 ? H2:H1);
    return H->next;
}

思路二:递归
在两表都不为空的情况下,如果一个表当前data更小,把该表的next修改为(next)与(另一个表)中更小者。

struct listnode* merge_list(struct listnode* H1,struct listnode* H2)
{
    if(H1==NULL)
        return H2;
    if(H2==NULL)
        return H1;
    if(H1->data < H2->data){
        H1-next=merge_list(H1->next,H2);
        return H1;
    }else{
        H2-next=merge_list(H1,H2-next);     
        return H2;
    }
}