0 题外话
嗯,从这次开始我就把题目换一下,改成解题报告了,因为我小节小结总是不分,等有时间也去改下之前的解题报告咯~~
我算了下自己的速度,作为一个本学期的额外爱好,到现在21天刷了100题,速度也还算好,毕竟像今天这样基本一题没法刷的时间占到一周的一半多的时间。
1 解题思想
题目是给两个单链表,里面的数值都是有序的,现在要求他们合并成一个有序链表。
这道题的做法就是,从两个单链表的头结点开始分别设立两个指针p,q,和一个新的临时头结点prehead(结果),同时每次比较的时候,选择p q当中最小的一个,修改指针到prehead那条链表的末尾,然后移动指针。。当p或q有一个到末尾后,则将剩下的那一部分直接链入最终结果当中。
2 原题
Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
3 AC解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* 合并有序的列表,设两个长度分别为n,m 那么时间复杂度为O(n+m)
*
* 分别设两个指针,都从对应序列的起点开始,每次选择最小的一个,加入到新的链表当中
*
* 值得学习的点:最开始我写的是每次比较厚都生成一个新的ListNode,后面才反应过来,对于链表的题,如果他没有要求的话,那么并不需要重新new,只需要每次都改变下指针就好
* */
public class Solution {
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
ListNode head=new ListNode(0);
ListNode p=head;
int val1,val2;
while(l1!=null || l2!=null){
val1=Integer.MAX_VALUE;
val2=Integer.MAX_VALUE;
if(l1!=null){
val1=l1.val;
}
if(l2!=null){
val2=l2.val;
}
if(val1<val2){
p.next=l1;
l1=l1.next;
} else{
p.next=l2;
l2=l2.next;
}
p=p.next;
}
return head.next;
}
/**
* 这个版本充分利用了上述特性进行加速,注意判断l1 l2是否到结尾的时候,如果有一边为空,那么直接连接到另一个的当前位置返回就好
*
* leetcode上都是1ms,不过这个方法更优
* */
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head=new ListNode(0);
ListNode p=head;
int val1,val2;
while(l1!=null || l2!=null){
val1=Integer.MAX_VALUE;
val2=Integer.MAX_VALUE;
if(l1!=null){
val1=l1.val;
} else{
p.next=l2;
break;
}
if(l2!=null){
val2=l2.val;
} else{
p.next=l1;
break;
}
if(val1<val2){
p.next=l1;
l1=l1.next;
} else{
p.next=l2;
l2=l2.next;
}
p=p.next;
}
return head.next;
}
}