剑指offer:合并两个有序链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
一、非递归
①利用两个node(head、cur),head指向头节点,cur指向当前处理的节点。
②遍历比较list1和list2的元素,将小的元素添加入链表,如果一条链表遍历结束,将另一条剩余元素合并到新链表。
③最后返回头节点。
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){ //list1为空
return list2;
}
if(list2 == null){ //list2为空
return list1;
}
ListNode head = null;
ListNode cur = null;
while(list1 != null && list2 != null){ //当list1 与 list2 都不为空
if(list1.val < list2.val){ //list1的元素 小于 list2的元素
if(head == null){ //当添加第一个元素
cur = head = list1; //头节点指向第一个元素
}else{
cur.next = list1; //将元素添加入链表
cur = cur.next; //移动cur指针
}
list1 = list1.next; //移动list1指针
}else{
if(head == null){
cur = head = list2;
}else{
cur.next = list2;
cur = cur.next;
}
list2 = list2.next;
}
}
if(list1 == null){ //list1遍历结束
cur.next = list2; //将list2剩余元素添加入新链表
}
if(list2 == null){ //list2遍历结束
cur.next = list1;//将list1剩余元素添加入新链表
}
return head; //返回头节点
}
二、递归
逐个比较list1的元素与list2的元素大小,将小的元素添加到另一条链表,最后两条链表都是有序链表,返回任意一条即可。
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
while(list1 != null && list2 != null){
if(list1.val < list2.val){ //比较list1的val 与 list2的val
//将list2的元素添加到list1中,直到list1.val 》 list2.val
list1.next = Merge(list1.next,list2);
return list1;
}else{
//将list1的元素添加到list2中,直到list1.val 《 list2.val
list2.next = Merge(list1,list2.next);
return list2;
}
}
return list1; //list1 == list2
}

浙公网安备 33010602011771号