题目
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
解题
思路
跟归并排序的合并情况的思路一样,具体可看 Leetcode | 数组中的逆序对 这篇博文中对归并排序的详细介绍。
因为两个链表都是升序的,所以最小的都在最左边,假设初始化两个指针分别在两个链表的最左边,依次对比,选出更小的即合并之后当前最小加入结果链表,相应指针后移继续比较,直至所有元素都比较完,合并后的元素也排序完了。
递归实现
将指针的右移用递归实现
/**
* 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) {
//递归
//判断特殊情况
if(l1 == null) return l2;
if(l2 == null) return l1;
//l1,l2为头结点,最左边,所以依次比较
if(l1.val > l2.val){//选择l2挑选出来,l2后移,即结果数组中l2的后面是从l1开始和从当前l2后面开始的两个链表的合并结果
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}else{
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
}
}
迭代实现
指针的右移手动在循环里迭代实现
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//迭代 创建一个结果链表 一般设置链表的头结点为空
ListNode resfirst = new ListNode(0);
ListNode reslast = resfirst;//维护结果链表的最后一个结点
//判断特殊情况
if(l1 == null) return l2;
if(l2 == null) return l1;
//l1,l2为头结点,最左边,所以依次比较
while(l1 != null && l2 != null){
if(l1.val > l2.val){//l2更小
reslast.next = l2;//l2挑选出来加入结果列表
l2 = l2.next;//l2后移
}else{
reslast.next = l1;
l1 = l1.next;
}
reslast = reslast.next;//加入一个结点后,reslast后移一个,维护在链表的尾结点位置
}
//把l1或l2哪个不为空的剩余的结点加入结果链表中
reslast.next = l1 == null?l2:l1;
return resfirst.next;
}
}