合并有序链表
例如:1 2 3 1 1 3 5 7
1 1 1 2 3 3 5 7
1. ListNode cur1 = l1; ListNode cur2 = l2;
2. 如果两个链表都还有结点:while(cur1 !=null && cur2 !=null),
选择小的尾插到结果链表(result = null);
3.必有一个链表没有结点了,直接把剩余一条链表接在后边。
主要代码如下:
//合并有序链表
public ListNode mergeTwoLists(ListNode l1,ListNode l2){
if(l1==null){
return l2;
}
if(l2==null){
return l2;
}
ListNode cur1=l1;
ListNode cur2=l2;
ListNode result=null;
ListNode last=null;
while(cur1!=null&&cur2!=null){
if(cur1.val<cur2.val){
ListNode next=cur1.next;
//把cur1尾插到result上
//两种情况:链表为空链/非空链表
//1. 空链 : 头插
//2. 非空链表 :1)确定最后一个结点(利用last记录)
// 2)最后一个结点的next=cur
if(result==null){
result=cur1;
}else{
last.next=cur1;
}
last=cur1; //保证last 永远指向最后一个结点
cur1=next;
}else{
ListNode next=cur2.next;
if(result==null){
result=cur2;
}else{
last.next=cur2;
}
last=cur2;
cur2=next;
}
}
if(cur1!=null){
last.next=cur1;
}else{
last.next=cur2;
}
return result;
}
}
测试代码:
public static void testMergeTwoLists(){
System.out.println("测试合并有序链表");
ListNode n1=new ListNode(1);
ListNode n2=new ListNode(1);
ListNode n3=new ListNode(3);
ListNode n4=new ListNode(5);
ListNode n5=new ListNode(7);
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
n5.next=null;
ListNode n6=new ListNode(1);
ListNode n7=new ListNode(2);
ListNode n8=new ListNode(3);
n6.next=n7;
n7.next=n8;
n8.next=null;
Solution s=new Solution();
ListNode result=s.mergeTwoLists(n1,n6);
//打印result
display(result);
}
public static void main(String[] args){
testMergeTwoLists();
}
结果如下:
测试合并有序链表
(1)-->(1)-->(1)-->(2)-->(3)-->(3)-->(5)-->(7)-->null