输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
Note:A题的时候一定要考虑特殊点,像这题特殊点在当其中有链表为空时应该怎么处理。
参数传入的是l1,l2当前节点,每次都要比较两链表当前的结点值大小,选择最小的,递归和迭代的性质就是这样。
方法一:
递归:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
return l2;
if(l2 == NULL)
return l1;
if (l1->val <= l2->val){
l1->next = mergeTwoLists(l1->next,l2);
return l1;
}
l2->next = mergeTwoLists(l1,l2->next);
return l2;
}
};
递归写法简便解法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) return l2 == null ?l1:l2;
ListNode first = (l1.val < l2.val) ? l1:l2;
first.next = mergeTwoLists(first.next , first == l1? l2 : l1);
return first;
}
}
方法二:
迭代法
时间复杂度 O(M+N): M,N 分别为链表 l1,l2的长度,合并操作需遍历两链表。
空间复杂度 O(1) : 节点引用 head , cur 使用常数大小的额外空间
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode cur = head;
while(l1 != null && l2 != null){
if (l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}
else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1 == null ? l2:l1;
return head.next;
}
}