Fork me on GitHub

合并两个有序链表--参考归并排序

合并两个有序链表是很常见的一个链表相关的算法题,因为当时在练习这个题的时候,刚学完排序算法没多久,所以我在练这个题的时候第一反应就是使用归并排序的“并”的思想。当然,我并没有去算过这个算法的时间复杂度,因为目前阶段只要能做出来就好了,哈哈哈(来自一个算法菜鸟的兴奋!!!),代码如下(虽然代码看起来有点啰嗦,其实还是很简单的,很多代码都一样):

 

package cn.czy.algorithm.linkedlist;

/**
 * 合并两个有序列表,思路参考归并排序的并过程
 */
public class MergeTwoLinked {
    public static void main(String[] args) {
        ListNode node1=new ListNode(1);
        ListNode node2=new ListNode(2);
        ListNode node3=new ListNode(3);
        ListNode node4=new ListNode(4);
        node3.next=node4;
        node2.next=node3;
        node1.next=node2;

        ListNode node5=new ListNode(0);
        ListNode node6=new ListNode(1);
        ListNode node7=new ListNode(2);
        ListNode node8=new ListNode(4);
        node7.next=node8;
        node6.next=node7;
        node5.next=node6;

        ListNode head = mergeTwoLinked(node1, node5);//调用合并方法
        while (head!=null){//输出链表节点
            System.out.println(head.toString());
            head=head.next;
        }
    }

    /**
     * 合并两个有序列表,思路参考归并排序的并过程
     * @param head1
     * @param head2
     * @return 返回合并后的链表
     */
    public static ListNode mergeTwoLinked(ListNode head1, ListNode head2) {
        if(head1==null && head2==null){//当两个链表都为空时返回null
            return null;
        }else if(head1!=null && head2==null){//当第2个链表为null时返回第1个链表
            return head1;
        }else if(head1==null && head2!=null){//当第1个链表为null时返回第2个链表
            return head2;
        }
        ListNode head;//定义合并后的链表的头指针
        ListNode next;//用于记录新链表的头结点的下一个节点
        //当第1个链表的第一个节点的值小于第2个链表的第一个节点的值时,将新链表的头结点指向第1个链表
        if(head1.val<head2.val){
            next=head1.next;
            head1.next=null;
            head=head1;
            head1=next;
        }else{//当第1个链表的第一个节点的值大于等于第2个链表的第一个节点的值时,将新链表的头结点指向第2个链表
            next=head2.next;
            head2.next=null;
            head=head2;
            head2=next;
        }
        ListNode temp=head;//用于遍历新链表
        while (head1 != null && head2 != null) {//根据节点值的大小拼接到新链表后面,当有一个链表已经遍历完后退出
            if (head1.val<head2.val){
                next=head1.next;
                head1.next=null;
                temp.next=head1;
                head1=next;
                temp=temp.next;
            }else{
                next=head2.next;
                head2.next=null;
                temp.next=head2;
                head2=next;
                temp=temp.next;
            }
        }
        if (head1!=null){//当第1个链表不为null时,直接拼接在新链表后面
            temp.next=head1;
        }
        if (head2!=null){//当第2个链表不为null时,直接拼接在新链表后面
            temp.next=head2;
        }
        return head;
    }
}

class ListNode {
    int val;
    ListNode next;

    public ListNode(int x) {
        val = x;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                '}';
    }
}

 

posted @ 2021-04-15 20:41  星期六去加班  阅读(226)  评论(1)    收藏  举报