合并2个有序链表
题目描述:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:
-
思路1
最容易想到的是归并排序时,合并2个分组的排序过程
时间复杂度是O(n+m)
空间复杂度是O(2n+2m) -
思路2:递归
简单来说,就是让数值小的结点的next指向下一次比较的结果小的结点,可以根据代码体会
时间复杂度是O(n+m)
空间复杂度是O(n+m) -
思路3:迭代
就是思路2的非递归方法
实现:
思路1:
public class MergeTwoLists {
public static void main(String[] args) {
//测试用例
ListNode l1=new ListNode(1);
l1.next=new ListNode(2);
l1.next.next=new ListNode(4);
ListNode l2=new ListNode(1);
l2.next=new ListNode(3);
l2.next.next=new ListNode(4);
ListNode result=mergeTwoLists(l1,l2);
while(result!=null){
System.out.println(result.val);
result=result.next;
}
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head=new ListNode(0);
ListNode result=head;
while(l1!=null&&l2!=null){
int l1Value=l1.val;
int l2Value=l2.val;
if(l1Value<=l2Value){
result.next=new ListNode(l1Value);
l1=l1.next;
}else{
result.next=new ListNode(l2Value);
l2=l2.next;
}
result=result.next;
}
while(l1!=null){
result.next=new ListNode(l1.val);
result=result.next;
l1=l1.next;
}
while(l2!=null){
result.next=new ListNode(l2.val);
result=result.next;
l2=l2.next;
}
return head.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
思路2:
public static ListNode merTwoLists02(ListNode l1, ListNode l2){
if(l1==null){
return l2;
}
else if(l2==null){
return l1;
}
else if(l1.val<=l2.val){
l1.next=merTwoLists02(l1.next,l2);
return l1;
}
else{
l2.next=merTwoLists02(l1,l2.next);
return l2;
}
}
思路3:
public static ListNode merTwoLists03(ListNode l1, ListNode l2){
ListNode prehead=new ListNode(-1);
ListNode prev=prehead;
while(l1!=null&&l2!=null){
int l1Value=l1.val;
int l2Value=l2.val;
if(l1Value<=l2Value){
prev.next=l1;
prev=prev.next;
l1=l1.next;
}else{
prev.next=l2;
prev=prev.next;
l2=l2.next;
}
}
while(l1!=null){
prev.next=l1;
l1=l1.next;
}
while(l2!=null){
prev.next=l2;
l2=l2.next;
}
return prehead.next;
}