[leetCode].合并两个有序列表
解法一 暴力解法
/**
* 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 prev = prehead;
//循环条件为l1!=null,l2!=null
while(l1 != null && l2 != null){
//比较l1,l2当前节点的大小
if(l1.val <= l2.val){
//将l1加到哑节点的链表上
prev.next = l1;
//l1指向l1链表上的下一个节点
l1 = l1.next;
}else{
//将l2加到哑节点的链表上
prev.next = l2;
//l2指向l2链表上的下一个节点
l2 = l2.next;
}
//无论l1与l2的值谁大,prev指针都要移动到哑节点链表的最后一个节点
prev = prev.next;
}
//循环结束后l1与l2一定有一个为非空,将非空链表拼接到哑节点所在链表的链表尾
prev.next = l1 == null ? l2 : l1;
return prehead.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) {
//l1.l2存在空链表,则返回非空链表
if(l1 == null){
return l2;
}else if(l2 == null){
return l1;
}else if(l1.val <= l2.val){ //如果l1,l2都非空,则比较头节点,将较小的头节点指向子问题返回的链表
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}