题意: 合并两个排好序的数组。
分析: 本题没有什么特别的技巧,考察对链表编程的熟练程度,注意一些特殊值或者边界情况吧。我是将第二个表
l2
全部插入到第一个表
l1
中。如果
l2
中当前值
present2
大于
l1
当前值,向后遍历
l1
直到值大于
present2
,将
present2
插入到l1中; 如果
present2
小于
l1
当前值,记录当前
present2
位置为
l2
,
present2
指针向后移动直到大于
l1
中的当前值为止,将
l2
到
present2
这一段的链表放入
l1
中。
代码
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null){
return l2;
}else if(l2 == null){
return l1;
}else{
ListNode previous1 = null; //指向present1的前面一个
ListNode present1 = l1; //遍历第一个链表的指针
ListNode present2 = l2; //遍历第二个链表的指针
while(present1 != null && present2 != null){
if(present1.val <= present2.val){
while(present1.next != null && present1.next.val <= present2.val){
present1 = present1.next;
}
ListNode temp = present2.next; //先缓存present2的next
present2.next = present1.next; //将present2插到present1的后面
present1.next = present2;
present2 = temp; //present2变成l2的后一个
previous1 = present1.next;
present1 = present1.next.next; //present1变成原来l1的后一个
}else{
l2 = present2;
while(present2.next != null && present2.next.val <= present1.val){
present2 = present2.next;
}
if(previous1 == null){ //头节点时
ListNode temp = present2.next;
present2.next = present1;
l1 = l2;
previous1 = present2;
present2 = temp;
}else{
ListNode temp = present2.next;
present2.next = present1;
previous1.next = l2;
previous1 = present1.next;
present2 = temp;
}
}
}
if(present1 == null && present2 != null){ //当l1已经遍历结束,将l2中剩余的都放入l1, 当l2遍历结束,则算法终止
previous1.next = present2;
}
return l1;
}
}