剑指Offer25:合并两个排序的链表(Java)

剑指 Offer 25. 合并两个排序的链表

递归版

每一次递归都返回一个结点且值等于两个节点最小的那个,这个返回结点的后继是下一层递归的返回值。一直递归直到有一个为空,返回不为空的结点。

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;
    }
}
原文地址:https://www.cnblogs.com/dongmm031/p/13771342.html