题目:合并两个有序链表
一. 迭代大法好
解题思路:
- 定义一个虚拟节点
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;
}
}
}