思路与合并两个有序数组是一样的,
重新建立一个node l3,同时遍历l1和l2,比较小的数就插入到l3的表尾,然后小的数指针后移。
不同的是,在遍历之前,得要先建立l3的头结点,也就是比较l1和l2的头结点数值大小,小的数作为l3的头结点。
这种方法空间复杂度为O(N)。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p1 = l1,p2=l2;
ListNode ret = null;
if(p1 == null)return p2;
else if(p2 == null)return p1;
else{
ListNode node = null;
if(p1.val < p2.val){
node = new ListNode(p1.val);
ret = node;
p1 = p1.next;
}else{
node = new ListNode(p2.val);
ret = node;
p2 = p2.next;
}
}
ListNode p3 = ret;
while(p1!=null || p2 != null){
ListNode node = null;
if(p1 == null){
p3.next = p2;
break;
}
if(p2 == null){
p3.next = p1;
break;
}
if(p1.val < p2.val){
node = new ListNode(p1.val);
p3.next = node;
p1 = p1.next;
}else{
node = new ListNode(p2.val);
p3.next = node;
p2 = p2.next;
}
p3 = p3.next;
}
return ret;
}
实际上,与数组不同,对于合并有序链表,我们可以使用O(1)的空间复杂度完成。思路与上面一样,先构造头节点,再依次遍历这两个链表。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;
if(l2 == null) return l1;
ListNode head = null;
if(l1.val < l2.val){
head = l1;
l1 = l1.next;
}else{
head = l2;
l2 = l2.next;
}
ListNode l3 = head;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
l3.next = l1;
l1 = l1.next;
}else{
l3.next = l2;
l2 = l2.next;
}
l3=l3.next;
}
if(l1!=null){
l3.next = l1;
}
if(l2!=null){
l3.next = l2;
}
return head;
}
引申到合并k个有序序列: