题目描述
/**
* 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; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
}
}
题目分析
- 题目比较简单,将两个有序的链表合并在一起,返回拼接好的链表(
返回的链表也要是有序的
) - 因为两个链表本来就是有序的,所以只需要从两个链表的头部开始逐个比对即可
题目解法
-
第一种:暴力迭代遍历
-
第二种:递归,即先将当前结点后面的的链表和另一个链表先合并,再和当前结点合并,和前面的思想是一样的。
代码
- 遍历
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 初始化结果链表
ListNode res = new ListNode(-1);
// 创建一个指针
ListNode prev = res;
// 遍历l1和l2的公共长度部分
while(l1 != null && l2 != null) {
if (l1.val < l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
// 剩余长度部分
prev.next = l1==null?l2:l1;
// 返回结果,去掉第一个
return res.next;
}
}
- 递归
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// l1遍历结束,直接拼接l2即可
if (l1 == null){
return l2;
}
// l2遍历结束,直接拼接l1即可
if (l2 == null){
return l1;
}
// 如果两个链表都没结束,判断大小
if(l1.val < l2.val) {
// l1较小则让l1后面的去和l2合并
l1.next = mergeTwoLists(l1.next, l2);
// 返回合并完成的l1
return l1;
} else {
// 其他情况则让l2后面的去和l1合并
l2.next = mergeTwoLists(l1, l2.next);
// 返回合并好的l2链表
return l2;
}
}
}