java实现合并两排序链表
2017-11-08 21:36
295 查看
需求:
将两个排序链表合并为一个新的排序链表。比如:给出
分析:
1、类似于将两个有序数组合并为一个新的有序数组,如果有一个数组是null,那么新的数组就是另一个,如果两个数组都不是null,这时候就需要对两个数组进行遍历。逐个比较两数组的元素,将小的数值添加到新的数组中,比如数组a中的数值小,就将a中的数值添加到新的数组中,并且将a的遍历角标向后移动一位,继续重复上述过程,直到某个数组被遍历完了,这时直接将未被遍历完的数组中的数值直接添加到新的数组中即可。
2、与合并有序数组不同的是,合并链表不需要开辟新的空间,只是指针的移动。
3、合并有序链表,需要先判断两个链表是否是null,如果一个是null,那么返回结果就是另一个链表的头结点。如果两个头结点都不是null,需要遍历两个链表,将数值小的节点添加到结果节点的next上,然后遍历向后移动一个,重复上述过程,直到最后有个链表遍历完了,这时将另一个链表中未被遍历的子链表的头节点赋给当前结果链表最后一个节点的next即可。
代码:
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/*
* @param l1: ListNode l1 is the head of the linked list
* @param l2: ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// write your code here
//判断l1和l2是否是null
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
//经过上述判断可以得到l1和l2都不是null
ListNode result = new ListNode(0);
ListNode p = result;//通过节点p对result对应的链表进行操作
while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;//也可以p.next = new ListNode(l1.val);但是会增加很多多余的节点,不够最优
p = p.next;
l1 = l1.next;
}
else{
p.next = l2;
p = p.next;
l2 = l2.next;
}
}
//如果l1==null,说明l2的链表中还有节点没有遍历,直接将p.next=l2即可
if(l1 == null){
p.next = l2;
}
else{
p.next = l1;
}
}
}
将两个排序链表合并为一个新的排序链表。比如:给出
1->3->8->11->15->null,
2->null, 返回
1->2->3->8->11->15->null。
分析:
1、类似于将两个有序数组合并为一个新的有序数组,如果有一个数组是null,那么新的数组就是另一个,如果两个数组都不是null,这时候就需要对两个数组进行遍历。逐个比较两数组的元素,将小的数值添加到新的数组中,比如数组a中的数值小,就将a中的数值添加到新的数组中,并且将a的遍历角标向后移动一位,继续重复上述过程,直到某个数组被遍历完了,这时直接将未被遍历完的数组中的数值直接添加到新的数组中即可。
2、与合并有序数组不同的是,合并链表不需要开辟新的空间,只是指针的移动。
3、合并有序链表,需要先判断两个链表是否是null,如果一个是null,那么返回结果就是另一个链表的头结点。如果两个头结点都不是null,需要遍历两个链表,将数值小的节点添加到结果节点的next上,然后遍历向后移动一个,重复上述过程,直到最后有个链表遍历完了,这时将另一个链表中未被遍历的子链表的头节点赋给当前结果链表最后一个节点的next即可。
代码:
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/*
* @param l1: ListNode l1 is the head of the linked list
* @param l2: ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// write your code here
//判断l1和l2是否是null
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
//经过上述判断可以得到l1和l2都不是null
ListNode result = new ListNode(0);
ListNode p = result;//通过节点p对result对应的链表进行操作
while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;//也可以p.next = new ListNode(l1.val);但是会增加很多多余的节点,不够最优
p = p.next;
l1 = l1.next;
}
else{
p.next = l2;
p = p.next;
l2 = l2.next;
}
}
//如果l1==null,说明l2的链表中还有节点没有遍历,直接将p.next=l2即可
if(l1 == null){
p.next = l2;
}
else{
p.next = l1;
}
}
}
相关文章推荐
- 《剑指offer》编程题java实现(十七):合并两个排序的链表
- JAVA实现合并两个排序的链表(《剑指offer》)
- 合并两个排序的链表java实现
- 链表插入、链表相加、链表相乘、链表排序、链表合并等操作的java实现
- Java实现-合并两个排序链表
- 剑指Offer 面试题25:合并两个排序的链表(递归+非递归) Java代码实现
- JAVA实现合并两个排序的链表(《剑指offer》)
- 剑指offer 面试题17 合并两个排序的链表-Java实现
- 剑指Offer--面试题17:合并两个排序的链表--Java实现
- 合并两个排序的链表(Java实现)
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 合并两个已排序的链表(递归方法实现)
- 剑指offer面试题java实现之题4之相关题目:两个排序数组合并
- 【LeetCode-面试算法经典-Java实现】【088-Merge Sorted Array(合并排序数组)】
- 剑指offer:合并两个排序的链表 代码实现
- 【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 剑指Offer面试题17(Java版):合并两个排序的链表
- java实现合并两个已经排序的列表实例代码
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】