文章目录
- 题目
- 方法一 暴力法:创建头结点,比较拼接
- 方法二 递归法
- 参考文献
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
方法一 暴力法:创建头结点,比较拼接
创建一个空的头结点head,然后依次将l1和l2节点的值进行比较,谁小谁就接在head的后面,然后这样一直遍历比较下去,当其中一个链表为空时,如果另一个链表还有值,直接在head链表的末端接入即可.
时间复杂度:O(m+n)
空间复杂度:O(1)
此处有点疑惑:创建了一个头结点算是创建了新的空间了吗?
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head=new ListNode();
ListNode temp=head;
while(list1!=null&&list2!=null){
if(list1.val<list2.val){
temp.next=list1;
temp=list1;
list1=list1.next;
}else{
temp.next=list2;
temp=list2;
list2=list2.next;
}
}
while(list1!=null){
temp.next=list1;
temp=list1;
list1=list1.next;
}
while(list2!=null){
temp.next=list2;
temp=list2;
list2=list2.next;
}
return head.next;
}
}
方法二 递归法
时间复杂度:O(m+n)
空间复杂度:O(m+n)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}else if(list2==null){
return list1;
}else if(list1.val<list2.val){
list1.next=mergeTwoLists(list1.next,list2);
return list1;
}else{
list2.next=mergeTwoLists(list1,list2.next);
return list2;
}
}
}
参考文献
点击跳转
https://leetcode.cn/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/