您的位置:首页 > 其它

Leetcode #21 Merge Two Sorted Lists 合并有序链表 解题报告

2016-03-23 20:54 459 查看

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: