剑指Offer25:合并两个排序的链表(Java)
递归版
每一次递归都返回一个结点且值等于两个节点最小的那个,这个返回结点的后继是下一层递归的返回值。一直递归直到有一个为空,返回不为空的结点。
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode tmp = new ListNode();
if(l1.val <= l2.val){
tmp.val = l1.val;
tmp.next = mergeTwoLists(l1.next,l2);
}else{
tmp.val = l2.val;
tmp.next = mergeTwoLists(l1,l2.next);
}
return tmp;
}
}
非递归版
构建一个结点充当合并后的链表的头结点(这样方便最后返回整个链表),用cur表示合并后链表的当前结点,遍历两个链表,两个链表小的那个结点作为cur的后继。更新链表和cur的位置。最后当有一条链表为空退出循环时,将另一个链表的结点作为cur的后继,结束。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode();
ListNode cur = dummy;
while(l1 != null && l2 != null){
if(l1.val <= l2.val){
cur.next = l1;//将值小的结点作为cur的后继
l1 = l1.next;//更新链表指针
}else{
cur.next = l2;//将值小的结点作为cur的后继
l2 = l2.next;//更新链表指针
}
cur = cur.next;//更新cur的位置
}
if(l1 != null){
cur.next = l1;
}else{
cur.next = l2;
}
return dummy.next;
}
}