剑指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、首先要把思路搞清楚,多画图.
Linux等环境软件安装