leetCode 21题 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
迭代法
定义一个哑节点dummy和一个前进节点cur;
只要两个指针都不指向空,就遍历两个链表,对两个指针所指节点作如下处理:
比较两个节点的值;
将较小的节点放在cur后面,然后再将该节点上的指针往前移动一步;
cur也往前移动一步;
将非空的链表接到cur后面
只要返回dummy.next即可。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//1.初始化
ListNode dummy = new ListNode(0);//哑节点
ListNode cur = dummy;
//2.遍历
while(l1 != null && l2 != null){
if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = (l1 != null) ? l1 : l2; //3.遍历后剩余的非空链表接在cur后面
return dummy.next;//返回哑节点的后一个节点
}
}
递归法
递归基(递归终止条件):l1为null,返回l2;l2为空,返回l1。(已经包含了l1和l2均为空的两种情况,你细品!)
递归方法本质:传入的参数为两个链表的头节点指针,是对这两个链表的合并。
因此,只要把节点值小的节点后面的链表和另一个链表继续合并,然后将结果再放在小节点的后面,最后返回小节点即可
class Solution {
//本质是对l1, l2为头节点的两个链表进行合并
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//1.递归终止条件
if(l1 == null) return l2;
if(l2 == null) return l1;
//2.递归合并
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next,l2); //对l1.next, l2为头节点的两个链表进行合并
return l1;
}else{
l2.next = mergeTwoLists(l2.next,l1); //对l2.next, l1为头节点的两个链表进行合并
return l2;
}
}
}