题目的链接在这里:https://leetcode-cn.com/problems/merge-two-sorted-lists/
题目大意
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
一、示意图
二、解题思路
使用递归和非递归
非递归
代码如下:
/**
* 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) {
//非递归的写法
ListNode head;
ListNode pre=new ListNode(0);
head=pre;
while (l1!=null&&l2!=null){
if(l1.val>=l2.val){
//这些转化需要求改一些
//L2更小
pre.next=l2;
pre=pre.next;
l2=l2.next;
}
else{
pre.next=l1;
pre=pre.next;
l1=l1.next;
}
}
//这样可能会出现一个是非空的
if(l1!=null){
//那就把剩下的放到里面去
pre.next=l1;
}
if(l2!=null){
pre.next=l2;
}
return head.next;
}
}
递归
代码如下:
/**
* 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) {
//递归的写法
//先进行边界判断
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
//然后开始这边的递归
if(l1.val>l2.val){
//说明l2小一点
//那就是找l2的下一个 并且使用这个方法来生成 l1和l2.next能生成的链表
l2.next=mergeTwoLists(l1,l2.next);
//然后返回l2
return l2;
}
//如果没有这个操作的话 就说明是l1比较小
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}
}