剑指offer---合并两个排序的链表(Java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40244153/article/details/87649478

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

思路:1.递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现,当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接。
         2.非递归实现:非递归实现比较容易想到,直接进行分情况讨论即可,要稍微注意下后面代码中头结点的赋值过程。
收获:1.递归还是不够熟悉,第一反应想到的还是非递归实现。注意每次操作相同时,要立即考虑到可以采用递归来进行实现。
          2.递归实现时,需要注意链接的问题。

class ListNode {
    int val = 0;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}
public class Solution {
    /*
     * 非递归
     */
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)  {return list2;}
        if(list2 == null)  {return list1;}
        ListNode p = new ListNode(0);
        ListNode head = p;
        while(list1 != null && list2 != null){
            if(list1.val < list2.val){
                p.next = list1;
                list1 = list1.next;
                p = p.next;
            }else{
                p.next = list2;
                list2 = list2.next;
                p = p.next;
            }
        }
        if(list1==null) {
            p.next = list2;
        } else {
            p.next = list1;
        }
        return head.next;
    }
    /*
     * 递归
     */
    public ListNode merge(ListNode list1,ListNode list2) {
        if(list1==null) return list2;
        if(list2==null) return list1;
        if(list1.val<list2.val) {
            list1.next=merge(list1.next, list2);
            return list1;
        }else {
            list2.next=merge(list1, list2.next);
            return list2;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40244153/article/details/87649478