25 合并两个排序的链表
注意📢:这道题要注意鲁棒性的问题。每当代码试图访问空指针指向的内存时程序就会崩溃,从而导致鲁棒性问题。在这道题中一旦输入空的链表就会引入空的指针,因此我们要对空链表单独处理。当第一个链表是空链表,也就是它的头结点是一个空指针时,那么把它和第二个链表合并,显然合并的结果就是第二个链表。同样,当输入的第二个链表的头结点是空指针的时候,我们把它和第一个链表合并得到的结果就是第一个链表。如果两个链表都是空链表,则合并的结果是得到一个空链表。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode head;
if(l1.val<l2.val){
head = l1;
l1 = l1.next;
}
else{
head = l2;
l2=l2.next;
}
ListNode p =head;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
p.next=l1;
l1=l1.next;
p=p.next;
}else{
p.next=l2;
l2=l2.next;
p=p.next;
}
}
//出循环,还存在某一个链表没遍历完
if(l1!=null){
p.next = l1;
}
if(l2!=null){
p.next=l2;
}
if(l1==null && l2==null){
p.next = null;
}
return head;
}
}
时间复杂度
O
(
m
+
n
)
O(m+n)
O(m+n)。
m
,
n
m,n
m,n分别是两个链表中包含的元素个数。
空间复杂度
O
(
1
)
O(1)
O(1)。
引入伪头结点
一般来说,在处理链表相关问题的时候,引入伪头结点(辅助头结点)会简化问题的处理,这样就不用单独把头结点拿出来分析了,代码更简单。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode head = new ListNode(0);
ListNode p =head;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
p.next=l1;
l1=l1.next;
p=p.next;
}else{
p.next=l2;
l2=l2.next;
p=p.next;
}
}
//出循环,还存在某一个链表没遍历完
if(l1!=null){
p.next = l1;
}
if(l2!=null){
p.next=l2;
}
if(l1==null && l2==null){
p.next = null;
}
return head.next;
}
}