输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路
(1)合并两个链表,特点是两个链表自身是单调递增的。
(2)刚开始纠结的是头结点的处理,是初始化list1还是list2,理论上都可以,或者任意一个数字。
(3)关于头结点备份的问题。这是OJ时候的主要bug,开始的时候一直是node从头结点开始赋值改变的,这样即便backup也不起作用。参考别人的写法是ListNode head=new ListNode(1); ListNode root=head;
,在赋值中采用head.next
另外在返回的时候是return root.next;
而不是return root
。return root
只能得到第一次初始化的结点,而return head
得到则是null
。
(4)关于合并的时候的条件的混乱,其实就是在考虑鲁棒性问题,当两个链表长度不同时的处理方法。另外将while(list1!= null && lis2 ==null){}
改成if(list1!= null)
的巧妙。
解法
nowcoder的AC
提交时间:2020-01-04 ,语言:Java ,运行时间: 30 ms ,占用内存:9468K ,状态:答案正确
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head1=list1;
ListNode head2=list2;
if(list1==null && list2 ==null){
return null;
}
//init a head node
ListNode head=new ListNode(1);
//backup
ListNode root=head;
while(list1!= null && list2 != null){
if(list1.val>list2.val){
head.next=list2;
head=head.next;
list2=list2.next;
}else{
head.next=list1;
head=head.next;
list1=list1.next;
}
}
if(list1!= null ){
head.next=list1;
}
if(list2 != null){
head.next=list2;
}
return root.next;
}
}