Leetcode 21 合并两个有序链表 (链表)
注意注意:先添加元素toadd.next = list1,添加之后才可以移动指针toadd = toadd.next
解法1 复杂的第一版本(优化大于和等于合并见方法二)
程序的时间复杂度是O(n + m),其中n和m分别是两个输入链表的长度。这是因为程序需要遍历两个链表中的所有节点,直到其中一个链表遍历完为止。
🔴空间复杂度是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 newlist = new ListNode(0); // 初始化一个链表节点,头节点保持不变保证后续返回
ListNode toadd = newlist; //用作添加的节点,要不断后移
while(list1 != null && list2 != null){
if(list1.val == list2.val){
toadd.next = list1;
toadd = toadd.next;
toadd.next = list2;
toadd = toadd.next;
list1 = list1.next;
list2 = list2.next;
}
else if(list1.val < list2.val) {
toadd.next = list1;
toadd = toadd.next;
list1 = list1.next;
}
else {
toadd.next = list2;
toadd = toadd.next;
list2 = list2.next;
}
}
if(list1 != null){
toadd.next = list1;
}
if(list2 != null){
toadd.next = list2;
}
return newlist.next;
}
}
解法2
/**
* 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 newlist = new ListNode(0); // 初始化一个链表节点,头节点保持不变保证后续返回
ListNode toadd = newlist; //用作添加的节点,要不断后移
while(list1 != null && list2 != null){
if(list1.val <= list2.val){ //当list1 的元素小于等于 list2,添加list1元素,list1右移
toadd.next = list1;
list1 = list1.next;
}
else { //当list2 的元素小于 list2,添加list2元素,list2右移
toadd.next = list2;
list2 = list2.next;
}
toadd = toadd.next; // 执行操作后toadd指向下一个
}
if(list1 != null){
toadd.next = list1;
}
if(list2 != null){
toadd.next = list2;
}
return newlist.next;
}
}