合并两个排序的链表

Posted 码上哈希

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并两个排序的链表相关的知识,希望对你有一定的参考价值。

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

思路:题目相对简单,有两个思路,一个是遍历两个链表的公共长度,按值的大小把各个节点连接起来,最后把较长链表的剩余部分追加到最后。第二个思路,这个类似于自然合并排序,可以使用递归分治的思想来解决问题,还让你容易就能把这个问题分解成子问题。

实现代码

非递归:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;
        
        ListNode head;
        if(list1.val<=list2.val) {
            head = list1;
            list1 = list1.next;
        }
        else {
            head = list2;
            list2 = list2.next;
        }
        
        ListNode pNode = head;
        
        while(list1 != null && list2 != null) {
            if(list1.val <= list2.val) {
                pNode.next = list1;
                list1 = list1.next;
            }
            else {
                pNode.next = list2;
                list2 = list2.next;
            }
            pNode = pNode.next;
        }
        
        while(list1 != null) {
            pNode.next = list1;
            pNode = pNode.next;
            list1 = list1.next;
        }
        
        while(list2 != null) {
            pNode.next = list2;
            pNode = pNode.next;
            list2 = list2.next;
        }
        
        return head;
    }
}

递归:

/*
public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;
         
        ListNode head;
         
        if(list1.val < list2.val) {
            head = list1;
            head.next = Merge(list1.next, list2);
        }
        else {
            head = list2;
            head.next = Merge(list1, list2.next);
        }
        return head;
    }
}

 

以上是关于合并两个排序的链表的主要内容,如果未能解决你的问题,请参考以下文章

代码的鲁棒性:合并两个排序的链表

《剑指Offer》题目:合并两个排序的链表

最强解析面试题:合并两个排序的链表

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

16.合并两个排序的链表

合并两个排序的链表