合并两个有序链表
前言
要想学好计算机算法至关重要
提示:以下是本篇文章正文内容,下面案例可供参考
一、合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题方法:
1.方法一:
思想:
在这个我创建了两个ListNode类
一个表示合并之后的空链表(list)
一个表示指针(list3),用于指向合并之后链表的最后一个节点的地址。
首先判断要合并的两个链表是否为空
如果只有一个链表为空则直接返回另一个不为空的链表
如果两个都为空则直接返回null
如果两个都不为空则:
首先比较这两个链表的第一个值,将较小节点的地址赋给list和list3(指针)
并且将那个较小的链表指向下一个结点
然后进行循环直到有一个链表被扫描完。
在循环内继续进行判断将较小的节点指向list3的下一个节点。
然后将list3指向它的下一个节点。
循环结束,判断是否有链表有值,如果有直接指向list的末尾。
返回list
代码如下(示例):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode list = null; //合并的链表
ListNode list3 = null; //合并链表的尾指针
if(list1 == null && list2 !=null){ //list2不为空;list1为空
return list2; //返回list2
}else if(list2 == null && list1 !=null){ //list1不为空;list2为空
return list1; //返回list1
}else if(list1 == null && list2 ==null){ //list1为空;list2为空
return null; //返回null
}else{
//两个都不为空
if(list1.val<= list2.val){ //list1的头节点的值小
list = list1; //将较小的元素的地址赋给list
list1 = list1.next; //list1指向它的下一个节点
}else{ //list2的头节点的值小
list = list2; //将较小的元素的地址赋给list
list2 = list2.next; //list2指向它的下一个节点
}
list3 = list; //将指针指向的list的尾指针
//循环
while(list1 !=null && list2!=null){
if(list1.val<= list2.val){
list3.next = list1;
list1 = list1.next;
}else{
list3.next = list2;
list2 = list2.next;
}
list3 = list3.next; //保证指针指向最后一个节点
}
//判断是否有一个链表没有扫描完
//若么有加到list末尾即可
if(list1 != null){
list3.next = list1;
}
if(list2 != null){
list3.next = list2;
}
return list;
}
}
}
总结
通过这个算法题主要是考察单链表的特点,在了解但单链表的特点之后可以很快的解决这个问题。时间复杂度为O(n+m)。