21.Merge Two Sorted Lists---《剑指offer》面试17
题目链接:https://leetcode.com/problems/merge-two-sorted-lists/description/
题目大意:
给出两个升序链表,将它们归并成一个链表,若有重复结点,都要链接上去,且新链表不新建结点。
法一:直接用数组归并的思想做,碰到一个归并一个,只是要注意链表前后结点之间的操作关系,应该弄清楚java里面引用之间的关系(此题容易面试当场写代码)。代码如下(耗时14ms):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode l = new ListNode(0);
ListNode tmp = l;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
l.next = l1;
l1 = l1.next;
// l = l.next;
}
else if(l1.val > l2.val) {
l.next = l2;
l2 = l2.next;
// l = l.next;
}
else {
l.next = l1;
l1 = l1.next;
l = l.next; l.next = l2;
l2 = l2.next;
}
l = l.next;
}
if(l1 != null) {
l.next = l1;
}
else if(l2 != null) {
l.next = l2;
}
l = tmp;
return l.next;
}
}
带有测试代码:
package problem_21;
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public class MainTest {
public void addNode(ListNode l, int num) {
ListNode listNode = new ListNode(num);
listNode.next = null;
if(l == null) {
l = listNode;
return;
}
ListNode tmp = l;
while(tmp.next != null) {
tmp = tmp.next;
}
tmp.next = listNode;
}
public static void main(String[] args) {
MainTest t1 = new MainTest();
ListNode l1 = new ListNode(4);
t1.addNode(l1, 5);
// t1.addNode(l1, 6);
ListNode l2 = new ListNode(4);
t1.addNode(l2, 6);
// t1.addNode(l2, 7);
// while(l1 != null) {
// System.out.println("1val:" + l1.val);
// l1 = l1.next;
// }
// while(l2 != null) {
// System.out.println("2val:" + l2.val);
// l2 = l2.next;
// }
ListNode l = t1.mergeTwoLists(l1, l2);
while(l != null) {
System.out.println(l.val);
l = l.next;
}
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode l = new ListNode(0);
ListNode tmp = l;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
l.next = l1;//这里在将l1结点赋值给l.next后,不能立即执行l=l1,而只能执行l1=l1.next和l=l.next(这两个位置可以调换)
//至于为什么,还没完全弄明白,应该跟java里面的对象的引用有关系?
// l = l.next;
l1 = l1.next;
}
else if(l1.val > l2.val) {
l.next = l2;
// l = l.next;
l2 = l2.next;
}
else {//测试用例中有5和5归并,结果输出为5,5,所以这里要两次连接结点
l.next = l1;
l = l.next;
l1 = l1.next;
l.next = l2;
// l = l.next;
l2 = l2.next;
}
l = l.next;
}
if(l1 != null) {//由于不需要新建结点,所以只需要把剩下的链表结点接上去即可。
l.next = l1;
}
else if(l2 != null) {
l.next = l2;
}
l = tmp;
return l.next;
}
}
法二:递归归并。代码如下(耗时11ms):
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) {
return l2;
}
if(l2 == null) {
return l1;
}
ListNode l = null;
if(l1.val < l2.val) {
l = l1;
l.next = mergeTwoLists(l1.next, l2);
}
else {
l = l2;
l.next = mergeTwoLists(l1, l2.next);
}
return l;
}
21.Merge Two Sorted Lists---《剑指offer》面试17的更多相关文章
- 剑指offer 面试17题
面试17题: 题目:打印从1到最大的n位数 题:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1.2.3一直到最大的3位数999. 解题思路:需要考虑大数问题,这是题目设置的陷 ...
- [Leetcode][Python]21: Merge Two Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 21: Merge Two Sorted Listshttps://oj.le ...
- 21. Merge Two Sorted Lists(合并2个有序链表)
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- 21. Merge Two Sorted Lists【easy】
21. Merge Two Sorted Lists[easy] Merge two sorted linked lists and return it as a new list. The new ...
- 21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
21.Merge Two Sorted Lists 初始化一个指针作为开头,然后返回这个指针的next class Solution { public: ListNode* mergeTwoLists ...
- leetCode练题——21. Merge Two Sorted Lists(照搬大神做法)
1.题目 21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new l ...
- 刷题21. Merge Two Sorted Lists
一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...
- 【一天一道LeetCode】#21. Merge Two Sorted Lists
一天一道LeetCode系列 (一)题目 Merge two sorted linked lists and return it as a new list. The new list should ...
- C# 写 LeetCode easy #21 Merge Two Sorted Lists
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
随机推荐
- EM算法【转】
混合高斯模型和EM算法 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与K-means一样,给定的训练样本是, ...
- 洛谷 Roy&October之取石子
题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取pk 个(p为质数,k为自然数,且pk小于等于当前剩余石子数),谁取走最后一个石子 ...
- BZOJ1089 [SCOI2003]严格n元树 【dp + 高精】
Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...
- 硬盘杀手!Windows版Redis疯狂占用C盘空间【转】
[问题的原因] Windows版Redis启动后,会在C盘自动创建一个很大的文件,C:\Users\{你的用户名}\AppData\Local\Redis\RedisQFolk_****.dat 我们 ...
- bzoj5055: 膜法师(BIT)
大水题WA了两发T T 记录一下a[i]的前缀和,a[i]*a[j]就是sigma(a[j]*sumi[j-1]) 记录一下a[i]*a[j]的前缀和,a[i]*a[j]*a[k]就是sigma(a[ ...
- OpenCV中响应鼠标消息 (转)
#include <cv.h> #include <highgui.h> #include <stdio.h> #pragma comment(lib," ...
- angular 的 @Input、@Output 的一个用法
angular 使用 @input.@Output 来进行父子组件之间数据的传递. 如下: 父元素: <child-root parent_value="this is parent ...
- python如何优雅判断类型
http://note.youdao.com/noteshare?id=6f3a7963efc57b5d0b1c712654d100c6
- Jenkins基于角色的项目权限管理
参考博客:http://www.cnblogs.com/davidwang456/p/3701972.html 一.简介 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三 ...
- centos7通过yum安装MySQL
一:去官网查看最新安装包 https://dev.mysql.com/downloads/repo/yum/ 二:下载MySQL源安装包 wget http://dev.mysql.com/get/m ...