java实现合并两排序链表

来源:互联网 发布:邪恶帝软件下载 编辑:程序博客网 时间:2024/05/21 15:50

需求:

将两个排序链表合并为一个新的排序链表。比如:给出 1->3->8->11->15->null2->null, 返回1->2->3->8->11->15->null

分析:

1、类似于将两个有序数组合并为一个新的有序数组,如果有一个数组是null,那么新的数组就是另一个,如果两个数组都不是null,这时候就需要对两个数组进行遍历。逐个比较两数组的元素,将小的数值添加到新的数组中,比如数组a中的数值小,就将a中的数值添加到新的数组中,并且将a的遍历角标向后移动一位,继续重复上述过程,直到某个数组被遍历完了,这时直接将未被遍历完的数组中的数值直接添加到新的数组中即可。

2、与合并有序数组不同的是,合并链表不需要开辟新的空间,只是指针的移动。

3、合并有序链表,需要先判断两个链表是否是null,如果一个是null,那么返回结果就是另一个链表的头结点。如果两个头结点都不是null,需要遍历两个链表,将数值小的节点添加到结果节点的next上,然后遍历向后移动一个,重复上述过程,直到最后有个链表遍历完了,这时将另一个链表中未被遍历的子链表的头节点赋给当前结果链表最后一个节点的next即可。

代码:

/** * Definition for ListNode. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int val) { *         this.val = val; *         this.next = null; *     } * } */public class Solution {    /*     * @param l1: ListNode l1 is the head of the linked list     * @param l2: ListNode l2 is the head of the linked list     * @return: ListNode head of linked list     */    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        // write your code here        //判断l1和l2是否是null        if(l1 == null){            return l2;        }        if(l2 == null){            return l1;        }                //经过上述判断可以得到l1和l2都不是null        ListNode result = new ListNode(0);        ListNode p = result;//通过节点p对result对应的链表进行操作        while(l1 != null && l2 != null){            if(l1.val < l2.val){                p.next = l1;//也可以p.next = new ListNode(l1.val);但是会增加很多多余的节点,不够最优                p = p.next;                l1 = l1.next;            }            else{                p.next = l2;                p = p.next;                l2 = l2.next;            }        }                //如果l1==null,说明l2的链表中还有节点没有遍历,直接将p.next=l2即可        if(l1 == null){            p.next = l2;        }        else{            p.next = l1;        }    }}




原创粉丝点击