剑指offer16题

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

/**
 * 目标:
 * 输入两个单调递增的链表,输出两个链表合成后的链表,
 * 当然我们需要合成后的链表满足单调不减规则。
 * <p>
 * 思路:
 * 1、新建一个表头
 * 2、比较list1和list2每个节点的值,把节点小的摘出来,拼接到新链表末尾
 *      一指:curr。next指向新节点
 *      二移:curr和链表同时往前移动
 *      三断:把curr。next切断,这样就可以递归了
 * 3、当其中一个链表到达末端就直接把另一链表加入到新链表末尾当中
 *
 * 代码:
 */
public class Solution16 {
    public ListNode Merge(ListNode list1, ListNode list2) {
        if (list1 == null){
            return list2;
        }
        if (list2 == null){
            return list1;
        }
        /**
         * 1、新建一个表头
         */
        ListNode currNode = new ListNode(0);
        ListNode listNode = currNode;
        ListNode currNode1 = list1;
        ListNode currNode2 = list2;

        /**
         * 2、比较list1和list2每个节点的值,把节点小的摘出来,拼接到新链表末尾
         */
        while (null != currNode1 && null != currNode2) {
            if (currNode1.val < currNode2.val) {
                // 一指:curr。next指向新节点
                currNode.next = currNode1;
                // 二移:curr和链表同时往前移动
                currNode = currNode.next;
                currNode1 = currNode1.next;
                //三断:把curr。next切断
                currNode.next = null;
            } else {
                // 一指:curr。next指向新节点
                currNode.next = currNode2;
                // 二移:curr和链表同时往前移动
                currNode = currNode.next;
                currNode2 = currNode2.next;
                //三断:把curr。next切断
                currNode.next = null;
            }
        }
        /**
         * 3、当其中一个链表到达末端就直接把另一链表加入到新链表末尾当中
         */
        if (null != currNode1) {
            currNode.next = currNode1;

        }
        if (null != currNode2) {
            currNode.next = currNode2;
        }
        return listNode.next;
    }
}

小结:

1、做递归题,首先找一个最基本的结构,并把结构传进一个函数,这个函数就是解决问题的通式.

2、要有抽象的思维,逐层深入.

3、首先要把思路搞清楚,多画图.

 

posted @ 2020-08-09 20:43  Adom_ye  阅读(78)  评论(0编辑  收藏  举报