题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目地址:https://leetcode-cn.com/problems/merge-two-sorted-lists/
思路:
1、先判断l1或l2是否为空,某个为空则直接返回另一个链表的头结点。若都不为空,则设置4个辅助变量,一个是head用来处理头结点,p、q分别指向l1、l2的当前结点,r指向当前已排序好的链表的尾结点。最后哪个链表还有剩余则直接让r的next指向它的当前结点即可。
2、考虑到两个有序的链表再组合成有序链表,可以使用递归。两个链表中如果其中当前首节点一个为空则直接返回另一个链表的首节点。如果都不为空,则比较大小,值小的那个结点的next指向递归函数的返回值,然后再返回当前首节点。
代码展示:
1、
/**
* @ClassName Solution
* @Description
* @Author Administrator
* @Date 2020/6/1 21:50
* @Version 1.0
**/
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;
ListNode head = null;
ListNode p = l1, q = l2, r;
if(l1.val < l2.val){
head = l1;
r = head;
p = p.next;
}else {
head = l2;
r = head;
q = q.next;
}
while (p != null && q != null){
if(p.val < q.val){
r.next = p;
r = p;
p = p.next;
}else {
r.next = q;
r = q;
q = q.next;
}
}
if(p != null)
r.next = p;
if(q !=null)
r.next = q;
return head;
}
}
2、
/**
* @ClassName Solution1
* @Description
* @Author Administrator
* @Date 2020/6/1 21:58
* @Version 1.0
**/
public 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.next = mergeTwoLists(l1, l2.next);
return l2;
}else {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
}
}