菜单
本页目录

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

思路 & 解答

思路比较清晰,首先创建一个 -1 节点的新链表,然后两个链表都从头开始,循环到直到一个链表遍历到最后,谁的节点小,就加入新的链表后面。然后遍历两个链表剩下的元素,这些元素肯定比另一个链表的所有元素都大或者相等,直接加入新的链表后面即可。

代码如下:

    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null){
            return list2;
        }else if(list2==null){
            return list1;
        }else{
            ListNode head = new ListNode(-1);
            ListNode first = head;
            while(list1!=null&&list2!=null){
                if(list1.val<list2.val){
                    first.next = new ListNode(list1.val);
                    list1=list1.next;
                }else {
                    first.next = new ListNode(list2.val);
                    list2 = list2.next;
                }
                first = first.next;
            }
            while(list1!=null){
                first.next = new ListNode(list1.val);
                list1=list1.next;
                first = first.next;
            }
            while(list2!=null){
                first.next = new ListNode(list2.val);
                list2=list2.next;
                first = first.next;
            }
            return head.next;
        }
    }

C++ 代码实现如下:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode *Merge(ListNode *list1, ListNode *list2) {
        if (list1 == NULL) {
            return list2;
        } else if (list2 == NULL) {
            return list1;
        } else {
            ListNode *head = new ListNode(-1);
            ListNode *first = head;
            while (list1 != NULL && list2 != NULL) {
                if (list1->val < list2->val) {
                    first->next = new ListNode(list1->val);
                    list1 = list1->next;
                } else {
                    first->next = new ListNode(list2->val);
                    list2 = list2->next;
                }
                first = first->next;
            }
            while (list1 != NULL) {
                first->next = new ListNode(list1->val);
                list1 = list1->next;
                first = first->next;
            }
            while (list2 != NULL) {
                first->next = new ListNode(list2->val);
                list2 = list2->next;
                first = first->next;
            }
            return head->next;
        }
    }
};

时间复杂度:O(m+n),mn分别为两个单链表的长度 空间复杂度:O(1)

其实这道题还有一个迭代版本,那就是取当前两个链表的更小值,然后递归剩下的链表之间的比较,直到一个为空。

Java 代码如下:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if (list1==null) return list2;
        if (list2==null) return list1;
        if (list1.val <= list2.val) {
            list1.next = Merge(list1.next, list2);
            return list1;
        }
        else {
            list2.next = Merge(list1, list2.next);
            return list2;
        }
    }
}

C++ 代码如下:

#include<stdio.h>

struct ListNode {
    int val;
    struct ListNode *next;

    ListNode(int x) :
            val(x), next(NULL) {
    }
};

class Solution {
public:
    ListNode* Merge(ListNode* list1, ListNode* list2)
    {
        if (!list1) return list2;
        if (!list2) return list1;
        if (list1->val <= list2->val) {
            list1->next = Merge(list1->next, list2);
            return list1;
        }
        else {
            list2->next = Merge(list1, list2->next);
            return list2;
        }
    }
};

时间复杂度:O(m+n) 空间复杂度:O(m+n),递归其实需要消耗栈,递归一次需要存储至少一个变量。