21. 合并两个有序链表

Posted Jessey45

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21. 合并两个有序链表相关的知识,希望对你有一定的参考价值。

问题描述: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

迭代:使用双指针分别指向l1和l2,比较出较小值结点

//C

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


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(!l1) return l2;
    if(!l2) return l1;

    struct ListNode *p1, *p2, *pa, *head;
    p1 = l1;
    p2 = l2;
    if(p1-> val < p2-> val){
        head = p1;
        p1 = p1 -> next;
    }
    else {
        head = p2;
        p2 = p2 -> next;
    }
    pa = head;
    while(p1 != NULL && p2 != NULL){
        if(p1 -> val <= p2 -> val){
            pa -> next = p1;
            pa = p1;
            p1 = p1 -> next;
        }
        else{
            pa -> next = p2;
            pa = p2;
            p2 = p2 -> next;
        }
    }

    if(p1 != NULL) pa -> next = p1;
    if(p2 != NULL) pa -> next = p2;
    return head;
}

//JS
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    if(!l1) return l2;
    if(!l2) return l1;
    
    let p = l1, q = l2, head, pa;
    if(p.val < q.val) {
        head = p;
        p = p.next;
    }
    else {
        head = q;
        q = q.next;
    }

    pa = head;
    while(p && q){
        if(p.val < q.val) {
            pa.next = p;
            pa = p;
            p = p.next;
        }
        else{
            pa.next = q;
            pa = q;
            q = q.next;
        }
    }
    if(p) pa.next = p;
    if(q) pa.next = q;
    return head;
};

递归:

//C

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

//JS

var mergeTwoLists = function(l1, l2) {
    if(!l1) return l2;
    if(!l2) return l1;

    if(l1.val < l2.val){
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    }
    else{
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
};

  

 

以上是关于21. 合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章

21. 合并两个有序链表

21.合并两个有序链表

21. 合并两个有序链表

21. 合并两个有序链表

LeetCode 21. 合并两个有序链表

leetcode21合并两个有序链表