双指针
:定义l1_cur
,l2_cuir
分别指向两个链表,对两个链表当前节点进行比较,确定返回节点的下一个元素,当遍历完某条链表后,将尚未遍历完的链表直接放在返回链表的后面
//双指针
//类似归并排序
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//检查
if(l1==null&&l2==null) return null;
else if(l1==null) return l2;
else if(l2==null) return l1;
//这个是最终放回的节点
ListNode head = null;
//保存新链表的尾部方便添加新的节点
ListNode temp = head;
//定义两个指针:指向两个待合并链表的节点
ListNode l1_cur = l1;
ListNode l2_cur = l2;
//初始化temp与cur
if(l1_cur.val>l2_cur.val){
temp=head=l2_cur;
l2_cur=l2_cur.next;
}else{
temp=head=l1_cur;
l1_cur=l1_cur.next;
}
//当两个链表都没有遍历完则不断进行比较添加
//若有一个链表已经遍历完则跳出
while(l1_cur!=null&&l2_cur!=null){
//l1链表对应的节点大于l2当前节点,则保存l2节点
if(l1_cur.val>l2_cur.val){
temp.next = l2_cur;
l2_cur = l2_cur.next;
}else{//否则保存l1节点
temp.next=l1_cur;
l1_cur=l1_cur.next;
}
//更新temp指向已经确认顺序的末尾
temp=temp.next;
}
//上面是遍历完某条链表,还需要判断是否有的链表还没有遍历完
if(l1_cur!=null){
temp.next=l1_cur;
}
if(l2_cur!=null){
temp.next=l2_cur;
}
return head;
}
递归方法
/**
* 标签:链表、递归
这道题可以使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素
终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束
返回值:每一层调用都返回排序好的链表头
本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
O(m+n)O(m+n),mm 为 l1的长度,nn 为 l2 的长度
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists1(ListNode l1, ListNode l2){
if(l1==null) return l2;
if(l2==null) return l1;
if(l1.val<l2.val) {
l1.next=mergeTwoLists1(l1.next,l2);
return l1;
}else{
l2.next=mergeTwoLists1(l1,l2.next);
return l2;
}
}
2020/8/15
package August.Dpointers;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/8/15 0015 10:06
* 合并两个有序链表
*/
public class Problem21 {
/**
* 合并两个有序链表:迭代写法
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = null;
ListNode cur = dummyHead;
ListNode cur1 = l1;
ListNode cur2 = l2;
while (cur1!=null&&cur2!=null){
if(cur1.val<cur2.val){
cur.next = cur1;
cur1 = cur1.next;
}else {
cur.next = cur2;
cur2 = cur2.next;
}
cur = cur.next;
}
if(cur1!=null) cur.next = cur1;
if(cur2!=null) cur.next = cur2;
return dummyHead.next;
}
/**
* 递归写法
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2){
if(l1==null&&l2==null) return l1;
if(l1==null) return l2;
if(l2 ==null) return l1;
if(l1.val<l2.val) {
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
public static void main(String[] args) {
ListNode head1 = new ListNode(1);
ListNode A1 = new ListNode(2);
ListNode B1 = new ListNode(4);
head1.next = A1;
A1.next = B1;
ListNode head2 = new ListNode(1);
ListNode A2 = new ListNode(3);
ListNode B2 = new ListNode(4);
head2.next = A2;
A2.next = B2;
Problem21 problem21 = new Problem21();
ListNode mergeNode = problem21.mergeTwoLists(head1, head2);
System.out.println(mergeNode);
}
}