将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode h1=list1;
ListNode h2=list2;
ListNode h3=new ListNode(9);
ListNode tail=h3;
while ((h1!=null&&h2!=null)){
if(h1.val<=h2.val){
tail.next=new ListNode(h1.val);
tail=tail.next;
h1=h1.next;
}
else{
tail.next=new ListNode(h2.val);
tail=tail.next;
h2=h2.next;
}
}
while(h1==null&&h2!=null){
tail.next=new ListNode(h2.val);
tail=tail.next;
h2=h2.next;
}
while(h2==null&&h1!=null){
tail.next=new ListNode(h1.val);
tail=tail.next;
h1=h1.next;
}
return h3.next;
}
}
下面附上官方解法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1; //利用源链表中的结点,不用另外申请新的空间
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null ? l2 : l1; //这一步太妙了,不用再一个一个复制了
return prehead.next;
}
}
原创禁止转载!!!