剑指offer——合并两个排序的链表

来源:互联网 发布:网络漫画家朴泰俊 编辑:程序博客网 时间:2024/05/29 08:08

面17

题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路:
其实很像归并排序中的归并环节,所以考虑的东西基本差不多。
一开始我的代码发生了空指针错误。错误代码如下。

public ListNode Merge(ListNode list1,ListNode list2) {        ListNode result = null;        ListNode temp = result; // 错误开始的地方                if(list1==null&&list2==null)            return null;        if(list1==null)            return list2;        if(list2==null)            return list1;       if(list1.val<=list2.val){           result = list1;           list1 = list1.next;       }        else{            result = list2;           list2 = list1.next;        }        while(list1!=null&&list2!=null){            if(list1.val<=list2.val){                temp.next = list1; // NullPointerException                list1 = list1.next;                temp = temp.next;            }            else{               temp.next = list2;                list2 = list2.next;                temp = temp.next;             }        }        if(list1==null)            temp.next = list2;        else            temp.next = list1;        return result;    }

在创建temp这个对象时,我将result赋予了它,其实temp是指向了此时result指向的对象,也就是null对象。
之后result引用指向了某个节点,但temp的指向并不会因此改变。仍指向null。所以发生错误!!

把temp的创建移到result改变引用对象后即可。

构建一个fake head,可以少些很多代码

public class Solution {    public ListNode Merge(ListNode list1,ListNode list2) {        ListNode head = new ListNode(1);        ListNode temp = head;        while(list1!=null&&list2!=null){            if(list1.val<=list2.val){                temp.next = list1; // NullPointerException                list1 = list1.next;            }            else{                temp.next = list2;                list2 = list2.next;            }            temp = temp.next;                     }        if(list1==null)            temp.next = list2;        else            temp.next = list1;        return head.next;    }}

还有递归的解法

public ListNode Merge(ListNode list1, ListNode list2) {        ListNode head = null;        if(list1==null&&list2==null)            return null;        else if(list1==null)            return list2;        else if(list2==null) return list1;        if (list1.val >= list2.val) {            head = list2;            head.next = Merge(list1, list2.next);        } else {            head = list1;            head.next = Merge(list1.next, list2);        }        return head;    }