【Leetcode】21、合并两个有序链表(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 p = l1;
ListNode q = l2;
ListNode returnHead= new ListNode(0);
ListNode a = returnHead;
while(p!=null||q!=null){
int pi = (p!=null)?p.val:Integer.MAX_VALUE;
int qi = (q!=null)?q.val:Integer.MAX_VALUE;
if(pi<=qi){
a.next = new ListNode(pi);
p=p.next;
}else{
a.next = new ListNode(qi);
q=q.next;
}
a = a.next;
}
return returnHead.next;
}
}
依然垃圾的一p。
三、题解代码
1、递归
/**
* 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;
}
else if(l2 == null){
return l1;
}
else if(l1.val<l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
}
- 标签:链表、递归
- 这道题可以使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素
- 终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束
- 返回值:每一层调用都返回排序好的链表头
- 本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
- O(m+n)O(m+n)O(m+n),mmm 为 l1的长度,nnn 为 l2 的长度
2、迭代
- 定义头节点,pre节点
- 对比l1与l2的值,使pre.next指向较小的值,然后较小的值的链表向后移一位
- pre向后移位
- 当l1或l2等于空时,结束
- 最后pre.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) {
ListNode preHead = new ListNode(-1);
ListNode pre = preHead;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
pre.next = l1;
l1 = l1.next ;
}
else{
pre.next = l2;
l2 = l2.next;
}
pre = pre.next;
}
pre.next = (l1==null)?l2:l1;
return preHead.next;
}
}