题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4


解答

C语言

通过递归的思想,如果给定的两个链表有一个是空,就返回另一个链表。
如果不空,比较当前链表1、2的第一个值,
如果1的值 <= 2的值,保持1的表头不变,1的next为(1的next组成的链表与2进行合并),最终返回1;
1的值 >= 2的值,保持2的表头不变,2的next为(2的next组成的链表与1进行合并),最终返回2。
依次递归即可。

//          4 ms	5.6 MB
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if (l1 == NULL) {
        return l2;
    }else if (l2 == NULL) {
        return l1;
    }else if (l1->val <= l2->val) {
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    }else {
        l2->next = mergeTwoLists(l2->next, l1);
        return l2;
    }
}

golang

nilNULL
//4 ms	2.6 MB
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    if l1 == nil {
        return l2
    } else if l2 == nil {
        return l1
    } else if l1.Val <= l2.Val {
        l1.Next = mergeTwoLists(l1.Next, l2)
        return l1
    } else {
        l2.Next = mergeTwoLists(l1, l2.Next)
        return l2
    }
}